【1075 25 排序】 PAT Judge
传送门
题意
给定\(id\)范围为\(1\sim n\)的人的\(k\)种程序测评成绩,\(m\)条记录,最后将所有人的排名、\(id\)、总成绩和各个成绩输出,先总成绩降序,相同满分程序数降序,相同\(id\)升序
数据范围
\(n\leq 10^{4}\)
\(k\leq 5\)
\(m\leq 10^{5}\)
题解
- 没有提交过或者是没有编译通过的不统计
- 相同的人相同的科目有重复成绩取最大值
- 初始化每个科目为\(-2\),如果是\(-1\)输出时候输出\(0\),直接变为\(0\)
Code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
int id,tot=0,perfect=0,rk;
bool f=0;
int score[6]={-2,-2,-2,-2,-2,-2};
bool operator < (const node t) const {
if(tot==t.tot){
if(perfect==t.perfect) return id<t.id;
return perfect>t.perfect;
}
return tot>t.tot;
}
};
node usr[N];
int p[6];
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int n,k,m; cin>>n>>k>>m;
for(int i=1;i<=k;i++) cin>>p[i];
while(m--){
int a,b,c; cin>>a>>b>>c;
usr[a].id = a;
if(c>-1) usr[a].f=1;
else if(c==-1) c=0;
usr[a].score[b] = max(c,usr[a].score[b]);
}
vector<node>s;
for(int i=1;i<=n;i++)
if(usr[i].f) {
for(int j=1;j<=k;j++)
if(usr[i].score[j]!=-2){
usr[i].tot+=usr[i].score[j];
if(usr[i].score[j]==p[j]) usr[i].perfect++;
}
s.push_back(usr[i]);
}
sort(s.begin(),s.end());
for(int i=0;i<s.size();i++){
if(i!=0 && s[i].tot==s[i-1].tot) {
printf("%d ",s[i-1].rk);
s[i].rk=s[i-1].rk;
}
else printf("%d ",i+1),s[i].rk=i+1;
printf("%05d %d ",s[i].id,s[i].tot);
for(int j=1;j<=k;j++) {
if(s[i].score[j]==-2) printf("-");
else if(s[i].score[j]==-1) printf("0");
else printf("%d",s[i].score[j]);
if(j!=k) printf(" ");
else if(j==k && i!=s.size()-1) puts("");
}
}
}

浙公网安备 33010602011771号