解题思路:
主要理解题意即可,设置-2为未提交过,-1为编译未通过,最后按题目要求排序输出。
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10000 + 5;
struct User
{
int score[6];
int r, id, perfect;//perfect 用于表示完美解决的数量
int total;
bool operator < (const User& rhs) const
{
return total > rhs.total || (total == rhs.total && perfect > rhs.perfect)
|| (total == rhs.total && perfect == rhs.perfect && id < rhs.id);
}
} user[maxn];
int p[6];
bool judge(User a, int k)
{
for(int i = 1; i <= k; i++)
if(a.score[i] > -1) return true;
return false;
}
int main()
{
int n, k, m;
while(scanf("%d%d%d", &n, &k, &m) == 3)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= k; j++) user[i].score[j] = -2;
user[i].total = 0; user[i].perfect = 0;
}
for(int i = 1; i <= k; i++) scanf("%d", &p[i]);
for(int i = 0; i < m; i++)
{
int id, p_id, s;
scanf("%d%d%d", &id, &p_id, &s);
user[id].id = id;
if(s > user[id].score[p_id]) //大则更新
{
user[id].score[p_id] = s;
if(s == p[p_id]) //满分则改变标记
user[id].perfect++;
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= k; j++)
if(user[i].score[j] > -1) user[i].total += user[i].score[j];//计算总分
sort(user+1, user+n+1);
user[1].r = 1;
for(int i = 2; i <= n; i++)
if(user[i].total == user[i-1].total) user[i].r = user[i-1].r;
else user[i].r = i;
for(int i = 1; i <= n; i++)
{
if(!judge(user[i], k)) continue; //有一道题都没通过的就直接跳过
printf("%d %05d %d", user[i].r, user[i].id, user[i].total);
for(int j = 1; j <= k; j++)
if(user[i].score[j] > -1) printf(" %d", user[i].score[j]);
else if(user[i].score[j] == -1) printf(" 0");
else printf(" -");
printf("\n");
}
}
return 0;
}