30pts玄关求条
查看原帖
30pts玄关求条
1073754
__szh_DNCB__楼主2024/5/3 20:49

思路:先开一遍排序用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;
}
2024/5/3 20:49
加载中...