hdu 1084 What Is Your Grade?(标记数据)

来源:互联网 发布:阿里云公共dns 编辑:程序博客网 时间:2024/04/28 06:16

What Is Your Grade?


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
45 06:30:174 07:31:274 08:12:124 05:23:1315 06:30:17-1
 

Sample Output
100909095100



这道题看起来不难,但是操作起来有很多值得留意的地方(对于现在我这种新手来说能学到很多东西),不过写得比较累赘,如果测试数据多一点可能就会超时了。



#include <iostream>#include <algorithm> using namespace std;void bsort (int a[], int sec[], int e[], int k);void so(int a[], int b[], int k);int main() {int n;while(cin >> n && n != -1) {int i = 0;int num[105]={}, th[105]={}, rank[105]={};int tm[105] = {}, ts[105]={};char a, b;while(n--) {cin >> num[i] >> th[i] >> a >> tm[i] >> b >> ts[i];rank[i] = i;//标记原始位置 i++;}int sec[105];for(int k = 0;k < i;k++) {sec[k] = th[k] * 3600 + tm[k] * 60 + ts[k];}//时间化为秒来算 bsort(num, sec, rank, i);//对题数进行排序,题数相等时对时间大小进行排序,都是降序排序,即第一位最大. int grade[105]={}, regrade[105]={}, sec2[105]={};int sec4[105]={}, sec3[105]={}, tmp1[105]={},sec1[105]={};int tmp2[105] = {},tmp3[105]={},tmp4[105]={};int i4 = 0, i3 = 0, i2 = 0, i1 = 0;for(int k=0; k < i; k++) {//先对同题数的进行分组 if(num[k] == 5) grade[k] = 100;if(num[k] == 4) {grade[k] = 90;sec4[i4] = sec[k];tmp4[i4] = k;//下面的这个操作是记录这个秒数在原始排序中的位置 i4++;}if(num[k] == 3) {grade[k] = 80;sec3[i3] = sec[k];tmp3[i3] = k;i3++;}if(num[k] == 2) {grade[k] = 70;sec2[i2] = sec[k];tmp2[i2] = k;i2++;}if(num[k] == 1) {grade[k] = 60;sec1[i1] = sec[k];tmp1[i1] = k;i1++;}if(num[k] == 0) grade[k] = 50;}so(sec4, tmp4, i4);//每一组都进行升序排序,第一位就是用的秒数最小的数据。 so(sec3, tmp3, i3);so(sec2, tmp2, i2);so(sec1, tmp1, i1);for(int k = 0; k < i4/2; k++) {grade[tmp4[k]] = 95;//前1/2可以变为95,且是将总排序中对应位置的成绩进行替换。 }for(int k = 0; k < i3/2; k++) {grade[tmp3[k]] = 85;//同理 }for(int k = 0; k < i2/2; k++) {grade[tmp2[k]] = 75;}for(int k = 0; k < i1/2; k++) {grade[tmp1[k]] = 65;}for(int k = 0; k < i; k++) {//k为原始数据的位置,k=0时,输出rank值为0的数据,通过循环在总排序中进行查找。 for(int p = 0; p < i; p++) {if(rank[p] == k){cout << grade[p] << endl;p = 0;//重置p,从头开始找起。 break;}}}cout << endl;}}void bsort (int a[], int sec[], int e[], int k){for(int t = 0; t < k - 1; t++)for(int x=0; x < k - 1 - t; x++) {if(a[x] < a[x+1]) {swap(a[x], a[x+1]);swap(sec[x], sec[x+1]);swap(e[x], e[x+1]);}else if(a[x] == a[x+1]){if(sec[x] < sec[x+1]) {swap(sec[x], sec[x+1]);swap(e[x], e[x+1]);}}}}void so(int a[], int b[], int k){for(int t = 0; t < k - 1; t++)for(int x=0; x < k - 1 - t; x++) {if(a[x] > a[x+1]) {swap(a[x], a[x+1]);swap(b[x], b[x+1]);}}}


0 0
原创粉丝点击