@Point, point, life of student!
“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
期末考试有5个问题。如果你能解决所有5个问题,我会给你100分; 当然,对你们中的许多人来说都是相当困难的。如果你能解决4个问题,你也可以获得95或90分(只有当你的排名在解决4个问题的所有学生的前半部分时才可以得到前者)。比喻(以此类推),你可以获得85,80,75,70,65,60。但如果您没有解决任何问题,您将无法通过此考试,我会将您的分数标记为50.
注意,当3名学生解决了4个问题时,只有1名学生将获得95分。
祝大家都通过考试!
来吧!
输入
输入包含多个测试用例。每个测试用例首先包含一行中的整数N(1 <= N <= 100,学生数),然后是N行。每行包含P(0 <= P <= 5个已解决的问题数)和T(消耗时间)。当0 <p时,您可以假设所有数据都不同。
以负整数开头的测试用例将终止输入,并且不应处理此测试用例。
输出
输出N行, 每行是学生的成绩
每个案例后有一个空行,而且当学生数为1 时,则给的时少的分数。
用结构体存好时间等东西,然后排序排好后,使用排序将各个解题数段的时间排序,进行比较输出。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int s;
int l;
int t;
int soc;
}time;
void Quick_sort(int *a, int low, int high) {
if (low >= high) return ;
int left = low;
int right = high;
int key = a[left];
while (left != right) {
while (left < right && a[right] >= key)
right--;
a[left] = a[right];
while (left < right && a[left] <= key)
left++;
a[right] = a[left];
}
a[left] = key;
Quick_sort(a, low, left - 1);
Quick_sort(a, left + 1, high);
}
int main() {
time n[102];
int sum[7];
int time[3];
int sort[7][102];
int a;
int T;
while (scanf("%d", &T) && T >= 0) {
int m[6] ={0};
memset(sum, 0, sizeof(sum));
memset(sort, 0, sizeof(sort));
for (int i = 0; i < T; i++) {
scanf("%d%d:%d:%d", &a, &time[0], &time[1], &time[2]);
n[i].s = a;
n[i].l = i;
n[i].t = time[0] * 3600 + time[1] * 60 + time[2];
sum[a]++;
sort[a][m[a]++] = n[i].t;
}
for (int i = 1; i < 6; i++) {
Quick_sort(sort[i], 0, m[i]);
}
for (int i = 0 ; i < T ; i++) {
switch (n[i].s) {
case 5: printf("%d\n", 100);break;
case 4: if (n[i].t <= sort[n[i].s][m[n[i].s] / 2] ) printf("%d\n", 95);
else printf("%d\n", 90);
break;
case 3: if (n[i].t <= sort[n[i].s][m[n[i].s] / 2 ]) printf("%d\n", 85);
else printf("%d\n", 80);
break;
case 2: if (n[i].t <= sort[n[i].s][m[n[i].s] / 2 ] ) printf("%d\n", 75);
else printf("%d\n", 70);
break;
case 1: if (n[i].t <= sort[n[i].s][m[n[i].s] / 2 ]) printf("%d\n", 65);
else printf("%d\n", 60);
break;
case 0: printf("50\n" );
}
}
printf("\n");
}
return 0;
}