What Is Your Grade? HDU - 1084

“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

题解:直接看代码。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

struct node{
    int Pr;          //存储解题数。
    char Ti[10];     //存储时间。
    int lo;          //存储初始位置。
    int sc;          //存储得分。

}a[105];
bool cmp1(node w,node m){
    if(w.Pr==m.Pr) return strcmp(w.Ti,m.Ti)<0;
    else return w.Pr>m.Pr;
}
bool cmp2(node w,node m){
    return w.lo<m.lo;
}
int main()
{
    int n;
    while(scanf("%d",&n)&&n>=0){
        for(int i=0;i<n;i++){
            scanf("%d %s",&a[i].Pr,a[i].Ti);
            a[i].lo=i;     //记录初始位置。
        }
        sort(a,a+n,cmp1);  //按解题数目从高到低排列,相同解题数按时间由小到大排列。
        int num5=0,num4=0,num3=0,num2=0,num1=0;
        int sum5=0,sum4=0,sum3=0,sum2=0,sum1=0;
        for(int i=0;i<n;i++){   //统计各解题数各有多少人。
            if(a[i].Pr==5) num5++;  
            if(a[i].Pr==4) num4++;
            if(a[i].Pr==3) num3++;
            if(a[i].Pr==2) num2++;
            if(a[i].Pr==1) num1++;
        }
        sum5=num5,sum4=sum5+num4,sum3=sum4+num3,sum2=sum3+num2,sum1=sum2+num1;
        //根据规则,为所有人打分。
        for(int i=0;i<num5;i++)
            a[i].sc=100;
        for(int i=sum5;i<sum4;i++)
        {
            if(i<(sum5+sum4)/2) a[i].sc=95;
            else a[i].sc=90;
        }
        for(int i=sum4;i<sum3;i++)
        {
            if(i<(sum4+sum3)/2) a[i].sc=85;
            else a[i].sc=80;
        }   
        for(int i=sum3;i<sum2;i++)
        {
            if(i<(sum3+sum2)/2) a[i].sc=75;
            else a[i].sc=70;
        }
        for(int i=sum2;i<sum1;i++)
        {
            if(i<(sum2+sum1)/2) a[i].sc=65;
            else a[i].sc=60;
        }
        for(int i=sum1;i<n;i++)
            a[i].sc=50;
        sort(a,a+n,cmp2);  //按原先的顺序输出结果。
        for(int i=0;i<n;i++)
            printf("%d\n",a[i].sc);

        printf("\n");
    }

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值