思路:先开一遍排序用rank把学生排名记录下来,然后处理同分情况,处理完毕后再排一遍id的序保证按id顺序提交。
WA on #4-10。
样例正确。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+15;
struct Node{
int c;
int m;
int e;
int id;
int rank;
};
Node s[N];
int cmp(Node a,Node b){
int aall = a.c+a.e+a.m;
int ball = b.c+b.e+b.m;
if (aall != ball){
return aall > ball;
}
int a1 = a.c + a.m;
int b1 = b.c + b.m;
if (a1 != b1){
return a1 > b1;
}
int a2 = max(a.c,a.m);
int b2 = max(b.c,b.m);
if (a2 != b2){
return a2 > b2;
}else{
return false;
}
}
bool cmp1(Node a,Node b){
return a.id < b.id;
}
int main(){
int n;
cin >> n;
for (int i=1;i<=n;i++){
cin >> s[i].c >> s[i].m >> s[i].e;
s[i].id = i;
}
sort(s+1,s+1+n,cmp);
s[1].rank = 1;
for (int i=2;i<=n;i++){
if (s[i].c+s[i].e+s[i].m == s[i-1].c + s[i-1].e + s[i-1].m && s[i].c + s[i].m == s[i].c + s[i].m && max(s[i].c,s[i].m) == max(s[i-1].c,s[i-1].m)){
s[i].rank = s[i-1].rank;
}
else s[i].rank = i;
}
sort(s+1,s+1+n,cmp1);
for (int i=1;i<=n;i++){
cout <<s[i].rank <<'\n';
}
return 0;
}