C++题目:二分,排序

C_y_w001 2024-06-07 17:45:10

问题 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;
}

 

...全文
400 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_65320706 2024-06-12
  • 打赏
  • 举报
回复

有几个问题,第一个这里不建议用数组,数组必须要规定数组的长度,可以换成列表之类的,bool cmp(Node a, Node b) {
if (a.sum == b.sum) {
return a.index < b.index;
}
return a.sum > b.sum;
},这个返回值对吗,应该是布尔类型作为标记

65,144

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧