40 分,除 AC 的点外都是 WA。求大佬调代码,有注释帮助理解。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
struct medal{
int g,s,b,i;
}a[N],b[N],c[N]; // g,s,b
int f[N]; // 每个人最好的排名
bool cmpa(medal b,medal c){ // 金牌比较
return b.g > c.g;
}
bool cmpb(medal b,medal c){ // 银牌比较
return b.s > c.s;
}
bool cmpc(medal b,medal c){ // 铜牌比较
return b.b > c.b;
}
int main(int argc, char **argv){
// freopen("medal.in","r",stdin);
// freopen("medal.out","w",stdout);
int n;
cin >> n;
for (int i = 1;i <= n;i++){
cin >> a[i].g >> a[i].s >> a[i].b;
a[i].i = i;
b[i] = a[i];
c[i] = a[i];
}
sort(a + 1,a + n + 1,cmpa);
sort(b + 1,b + n + 1,cmpb);
sort(c + 1,c + n + 1,cmpc);
for (int i = 1;i <= n;i++){
int x = a[i].i,y = b[i].i,z = c[i].i;
// 金牌[i]还没存最高排名就保存当前排名,下同
if (!f[x]){
if (a[i].g == a[i - 1].g) f[x] = f[a[i - 1].i];
else f[x] = i;
}
if (!f[y]){
if (b[i].s == b[i - 1].s) f[y] = f[b[i - 1].i];
else f[y] = i;
}
if (!f[z]){
if (c[i].b == c[i - 1].b) f[z] = f[c[i - 1].i];
else f[z] = i;
}
}
for (int i = 1;i <= n;i++){
printf("%d\n",f[i]);
}
return 0;
}