标签:排序 a10 return using namespace 用户 i++ 结构 for
输入k个程序的每个程序的满分分数,再输入m条用户提交的记录。按要求进行分数的排序最后输出。是一道结构体的复杂排序
首先明确本题的输出要求:
bool isshown
标志实现,当输入的grade != -1时,则isshown
设置为true。0
,而没有提交的程序,即输出-
。struct record{
int user,id,ranked,num,total;
//user代表用户名,id代表题号,ranked排名,num代表得到满分的次数,tota总分
int grade[6]; //各个程序的得分
bool isshown = false; //默认为false表示没有成功的提交
}rec[maxn];
细节性太多,直接看代码吧。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4+10;
int a[6];
struct record{
int user,id,ranked,num,total;
int grade[6]; //各科分数
bool isshown = false; //默认为false表示没有成功的提交
}rec[maxn];
int n,k,m;
bool cmp(const record &a,const record &b) {
if(a.total != b.total) return a.total > b.total;
else if(a.num != b.num) return a.num > b.num;
else return a.user < b.user;
}
int main(void) {
int user,id,grade;
cin>>n>>k>>m;
for(int i = 1;i <= k;i++) scanf("%d",&a[i]);
for(int i = 1;i <= n;i++) fill(rec[i].grade,rec[i].grade+6,-2); //-2代表所有程序未提交
for(int i = 0;i < m;i++) {
scanf("%05d %d %d",&user,&id,&grade);
rec[user].user = user; //注意此处的写法是rec[user]而不是rec[i]。
rec[user].grade[id] = max(rec[user].grade[id],grade); //更新对应程序的最高分
if(grade != -1) rec[user].isshown = true; //出现了分数不为-1,则设置标记
}
//遍历所有的用户,获得总分数以及完整通过程序的个数num
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= k;j++) {
if(rec[i].grade[j] != -1 && rec[i].grade[j] != -2) //提交了并且编译通过则加到总分中
rec[i].total += rec[i].grade[j];
if(rec[i].grade[j] == a[j]) rec[i].num++; //如果是满分,则完整通过个数+1
}
}
//获得排名
sort(rec+1,rec+1+n,cmp);
rec[1].ranked = 1;
for(int i = 2;i <= n;i++) {
if(rec[i].total == rec[i-1].total) rec[i].ranked = rec[i-1].ranked;
else rec[i].ranked = i;
}
for(int i = 1;i <= n;i++) {
if(rec[i].isshown == true) {
printf("%d %05d %d ",rec[i].ranked,rec[i].user,rec[i].total);
for(int j = 1;j <= k;j++) {
if(j > 1) cout<<" ";
if(rec[i].grade[j] == -1) cout<<"0";
else if(rec[i].grade[j] == -2) cout<<"-";
else cout<<rec[i].grade[j];
}
cout<<endl;
}
}
return 0;
}
标签:排序 a10 return using namespace 用户 i++ 结构 for
原文地址:https://www.cnblogs.com/Western-Trail/p/10362956.html