之前没有考虑到AC过后还会再次提交AC的代码,这时perfect就不应该在次改变,查了好久%>_<%
#include<stdio.h>
#include<algorithm>
using namespace std;
struct person{
int id;
int problem[5];
int grade;
int rank;
int flag;
int perfect;
};
bool cmp_rank(const struct person &a, const struct person &b){
return a.grade > b.grade;
}
bool cmp(const struct person &a, const struct person &b){
if (a.grade == b.grade)
if (a.perfect == b.perfect)
return a.id < b.id;
else return a.perfect > b.perfect;
else return a.grade > b.grade;
}
int main(){
freopen("1.in", "r", stdin);
int NumOfProblem, NumOfUser, NumOfSub;
scanf("%d%d%d", &NumOfUser, &NumOfProblem, &NumOfSub);
int i;
int problem[5];
struct person *user = new struct person[NumOfUser + 5];
for (i = 0; i < NumOfUser; i++){
user[i].grade = 0;
user[i].flag = 0;
user[i].perfect = 0;
user[i].id = i + 1;
for (int j = 0; j < NumOfProblem; j++)
user[i].problem[j] = -2;
}
for (i = 0; i < NumOfProblem; i++)
scanf("%d", &problem[i]);
int id, pro, grade;
for (i = 0; i < NumOfSub; i++){
scanf("%d%d%d", &id, &pro, &grade);
if (grade == problem[pro - 1]&&user[id - 1].problem[pro - 1]!=grade)//就是这里!!!
user[id - 1].perfect++;
if (grade >= 0){
if (grade>user[id - 1].problem[pro - 1])
if (user[id - 1].problem[pro - 1]>=0)
user[id - 1].grade += grade - user[id - 1].problem[pro - 1];
else user[id - 1].grade += grade;
user[id - 1].flag = 1;
}
if (grade>user[id - 1].problem[pro - 1])
user[id - 1].problem[pro - 1] = grade;
}
sort(user, user + NumOfUser, cmp);
for (i = 0; i < NumOfUser; i++){
if (i == 0)
user[i].rank = 1;
else if (user[i].grade == user[i - 1].grade)
user[i].rank = user[i - 1].rank;
else user[i].rank = i + 1;
}
for (i = 0; i < NumOfUser; i++){
if (user[i].flag){
printf("%d %05d %d", user[i].rank, user[i].id, user[i].grade);
for (int j = 0; j < NumOfProblem; j++)
if (user[i].problem[j] != -2)
if (user[i].problem[j] == -1)
printf(" 0");
else printf(" %d", user[i].problem[j]);
else printf(" -");
putchar('\n');
}
}
return 0;
}