65,144
社区成员




题目描述
某省中小学生程序设计挑战赛正在进行!众所周知,参加挑战赛需要完成四道编程题目,每道题目的分数不同,最后选手获得的总分是四道题目的得分之和。竞赛结束后,组织者需要根据所有参赛者的得分从高到低来确定他们的排名。由于参赛者众多,组织者决定编写一个程序来自动计算并输出每个人的排名。具体的,一共有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;
}
有几个问题,第一个这里不建议用数组,数组必须要规定数组的长度,可以换成列表之类的,bool cmp(Node a, Node b) {
if (a.sum == b.sum) {
return a.index < b.index;
}
return a.sum > b.sum;
},这个返回值对吗,应该是布尔类型作为标记