C++题目:二分,排序

C_y_w001 C_y_w001 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

问题 A: 排名

题目描述

某省中小学生程序设计挑战赛正在进行!众所周知,参加挑战赛需要完成四道编程题目,每道题目的分数不同,最后选手获得的总分是四道题目的得分之和。竞赛结束后,组织者需要根据所有参赛者的得分从高到低来确定他们的排名。由于参赛者众多,组织者决定编写一个程序来自动计算并输出每个人的排名。具体的,一共有n名参赛者,依次输入每个参赛者的四道题的得分,请你编写一个程序,按照输入的顺序依次输出他们的排名,如果有总分相同的情况,则先输入的选手排名靠前。

输入

第一行包含一个整数 n,代表共有n名选手,
接下来n行,每行包括四个非负整数,第i行表示第i名选手四道题目的得分。

输出

输出包含n行,每行包含一个正整数,第i行表示第i名选手的排名,排名按照总分从高到低,如果总分相同则优先输入的选手排名更高。

样例输入 Copy

【样例1】
2
10 10 10 10
20 20 20 20
【样例1】
4
20 15 30 25
10 25 25 30
25 25 25 25
5 10 15 20

样例输出 Copy

【样例1】
2
1
【样例1】
2
3
1
4

提示

对于 10%的数据,n=2
对于 50%的数据,1<n<1000;
对于 100%的数据,1≤n<100000,每道题目得分不超过100.

 大致想法是:排序+二分,但是不对

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N=100002;


struct Node {
    int sum;
    int index;
}s[N];
int n,id=0,s2[N]={0};


int bs(int t) {
    int l = 0;
    int r = n - 1;
    while (l <= r) {
        int mid = (l+r) >>1;
        if (s[mid].sum == t) {
            return mid+id-s[mid].index;
        } else if (s[mid].sum > t) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    return -1;
}

bool cmp(Node a, Node b) {
    if (a.sum == b.sum) {
        return a.index < b.index;
    }
    return a.sum > b.sum;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int sum = 0;
        for (int j = 0; j < 4; ++j) {
            int a;
            scanf("%d", &a);
            sum += a;
        }
        s[i].sum = sum;
        s[i].index = i;
        s2[i]=sum;
    }

    sort(s, s + n, cmp);
    for (id = 0; id < n; ++id) {
        int x = bs(s2[id]);
        printf("%d\n", x+1);
    }
    return 0;
}

 

...全文
评论 1
收藏 已收藏
分享
返回顶部
C_y_w001
C++ 语言 65,214 成员 250,514 内容