注解
1、结构体排序:首先按做对的题数降序,然后按消耗的时间升序。
2、对于做对同样题目数量的同学来说,消耗时间在同样题目数前一半的同学与后一半的同学,分数是不同的,因此要统计出所有同学做对题目数量的个数,然后针对做对1,2,3,4道题目的同学,依据其消耗的时间是在前一半还是后一半,对其进行打分。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int score[6][2] = { {50, 50}, {60, 65}, {70, 75},
{80, 85}, {90, 95}, {100, 100}
};
struct Stu {
int id;
int num;
int tim;
int score;
};
int compare(Stu a, Stu b) {
if(a.num!=b.num) {
return a.num>b.num;
} else {
return a.tim<b.tim;
}
}
int compare2(Stu a, Stu b) {
return a.id<b.id;
}
int main() {
int N;
scanf("%d", &N);
while(N>0) {
int sum[6];
memset(sum, 0, sizeof(sum));
Stu stu[N];
int hh, mm, ss;
int num;
for(int i=0; i<N; i++) {
scanf("%d %d:%d:%d", &num, &hh, &mm, &ss);
sum[num]++;
stu[i].id = i;
stu[i].num = num;
stu[i].tim = hh*3600 + mm*60 + ss;
}
sort(stu, stu+N, compare);
int pos[6] = {1, 1, 1, 1, 1, 1};
for(int i=0; i<N; i++) {
if(stu[i].num==0 || stu[i].num==5) {
stu[i].score = score[stu[i].num][0];
} else if(sum[stu[i].num]==1) {
stu[i].score = score[stu[i].num][1];
} else {
int tmpNum = stu[i].num;
if(pos[tmpNum]<=sum[tmpNum]/2) {
stu[i].score = score[stu[i].num][1];
} else {
stu[i].score = score[stu[i].num][0];
}
pos[tmpNum]++;
}
}
sort(stu, stu+N, compare2);
for(int i=0; i<N; i++) {
printf("%d\n", stu[i].score);
}
printf("\n");
scanf("%d", &N);
}
return 0;
}