又是最后一个测试点过不去……
主要是没有判断输入-1是否可以覆盖,如果原先有分数输入-1就不能被覆盖
#include<cstdio>
#include<cstring>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
struct people
{
int id;
int problem[6]; //每题得分
bool pass;
int num;
int rank;
int sum;
}per[100005];
bool cmp(people p1, people p2)
{
if(p1.sum != p2.sum)
return p1.sum > p2.sum;
else if(p1.num != p2.num)
return p1.num > p2.num;
else if(p1.id != p2.id)
return p1.id < p2.id;
}
int main()
{
int n, k, m;
int p[6]; //每道题的分数
int uid;
int pid;
int score;
scanf("%d %d %d", &n, &k, &m);
for(int i = 1;i <= n; i++)
{
per[i].pass = false; //没有提交过一道题
per[i].sum = 0; //总分
per[i].num = 0; //完全正确的题数
for(int j = 1; j <= 5; j++)
per[i].problem[j] = -1; //每道题都没提交
}
for(int i = 1; i <= k; i++)
scanf("%d", &p[i]);
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &uid, &pid, &score);
per[uid].id = uid;
if(score != -1)
{
per[uid].pass = true; //提交了题目
if(per[uid].problem[pid] < score)
{
per[uid].problem[pid] = score; //换成得分最多的分数
if(per[uid].problem[pid] == p[pid])
per[uid].num++; //完全正确的题目
}
}
else if (score == -1)
{
if(per[uid].problem[pid]==-1) //不判断覆盖导致最后一个测试的过不去
per[uid].problem[pid] = 0;
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= k; j++)
{
if(per[i].problem[j] > 0)
per[i].sum += per[i].problem[j];
}
}
sort(per+1, per+n+1, cmp);
for(int i = 1; i <= n; i++)
{
if(i == 1)
per[i].rank = i;
else
{
if(per[i].sum == per[i-1].sum)
per[i].rank = per[i-1].rank;
else
per[i].rank = i;
}
}
for(int i = 1; i <= n; i++)
{
if(per[i].pass)
{
printf("%d %05d %d", per[i].rank, per[i].id, per[i].sum);
for(int j = 1; j <= k; j++)
{
if(per[i].problem[j] >= 0)
printf(" %d", per[i].problem[j]);
else if(per[i].problem[j] == -1)
printf(" -");
}
printf("\n");
}
}
return 0;
}