hduoj1084!【水题】

/*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都是对的。

你可能感兴趣的:(c)