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