/*What Is Your Grade?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8551 Accepted Submission(s): 2629
Problem Description
“Point, point, life of student!”
This is a ballad(歌谣)well known in colleges, and you must care about your score in this exam too. How many points can you get? Now,
I told you the rules which are used in this course.
There are 5 problems in this final exam. And I will give you 100 points if you can solve all 5 problems; of course, it is fairly difficulty
for many of you. If you can solve 4 problems, you can also get a high score 95 or 90 (you can get the former(前者) only when your rank is in
the first half of all students who solve 4 problems). Analogically(以此类推), you can get 85、80、75、70、65、60. But you will not pass this
exam if you solve nothing problem, and I will mark your score with 50.
Note, only 1 student will get the score 95 when 3 students have solved 4 problems.
I wish you all can pass the exam!
Come on!
Input
Input contains multiple test cases. Each test case contains an integer N (1<=N<=100, the number of students) in a line first, and then N lines
follow. Each line contains P (0<=P<=5 number of problems that have been solved) and T(consumed time). You can assume that all data are different
when 0<p.
A test case starting with a negative integer terminates the input and this test case should not to be processed.
Output
Output the scores of N students in N lines for each case, and there is a blank line after each case.
Sample Input
4
5 06:30:17
4 07:31:27
4 08:12:12
4 05:23:13
1
5 06:30:17
-1
Sample Output
100
90
90
95
100
Author
lcy
*/
#include<stdio.h>
#include<stdlib.h>
struct students
{
int num;
int time;
int score;
int num2;
}stu[110];
int cmp(const void *a , const void *b)//按照做题数从大到小,若相等则按时间数从小到大
{
struct students *c = (struct students *)a;
struct students *d = (struct students *)b;
if((*(struct students *)c).num != (*(struct students *)d).num)
return (*(struct students *)d).num - (*(struct students *)c).num;
else
return (*(struct students *)c).time - (*(struct students *)d).time;
}
int cmp1(const void*a, const void *b)//返回原序列
{
return (*(struct students *)a).num2 - (*(struct students*)b).num2;
}
int main()
{
int n, i, j, k, l;
while(scanf("%d", &n) != EOF)
{
if(n == -1)
break;
for(i = 0; i < n; i++)
{
scanf("%d%d:%d:%d", &stu[i].num, &j, &k, &l);
stu[i].time = j * 3600 + k * 60 + l;
stu[i].num2 = i+1;
}
qsort(stu, n, sizeof(stu[0]), cmp);
for(i = 0; i < n; i++)
{
if(stu[i].num == 5)
stu[i].score = 100;
else if(stu[i].num == 4)
stu[i].score = 90;
else if(stu[i].num == 3)
stu[i].score = 80;
else if(stu[i].num == 2)
stu[i].score = 70;
else if(stu[i].num == 1)
stu[i].score = 60;
else stu[i].score = 50;
}
for(i = 0; i < n; i++)
if(stu[i].score == 90)
{
for(j = i; j <= n; j++)
if(stu[j].score != 90)
{
for(k = i; k < i + (j-i)/2; k++)
stu[k].score = 95;
break;
}
break;
}
for(i = 0; i < n; i++)
if(stu[i].score == 80)
{
for(j = i; j <= n; j++)
if(stu[j].score != 80)
{
for(k = i; k < i + (j-i)/2; k++)
stu[k].score = 85;
break;
}
break;
}
for(i = 0; i < n; i++)
if(stu[i].score == 70)
{
for(j = i; j <= n; j++)
if(stu[j].score != 70)
{
for(k = i; k < i + (j-i)/2; k++)
stu[k].score = 75;
break;
}
break;
}
for(i = 0; i < n; i++)
if(stu[i].score == 60)
{
for(j = i; j <= n; j++)
if(stu[j].score != 60)
{
for(k = i; k < i + (j-i)/2; k++)
stu[k].score = 65;
break;
}
break;
}
qsort(stu, n, sizeof(stu[0]), cmp1);
for(i = 0 ; i < n; i++)
printf("%d\n", stu[i].score);
printf("\n");
}
return 0;
}
没什么特别的,就是结构体的排序。
唯一注意的是此题在杭电上,做题数只有一个人的时候,x0和x5都是对的。