What Is Your Grade?

来源:互联网 发布:环信 服务端开发 java 编辑:程序博客网 时间:2024/05/16 16:04

点击打开链接

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 <stdio.h>  
#include <algorithm>  
#include <string.h>  
using namespace std;  
struct node  
{  
    int list;       //原来的排序   
    int n;      //解决的题数   
    int time;       //花的时间(转化为秒)   
    int grade;      //最终成绩   
}pre[111];  
bool cmp1(node a,node b)  
{  
    if (a.n==b.n)  
        return a.time<b.time;  
    return a.n>b.n;  
}  
bool cmp2(node a,node b)  
{  
    return a.list<b.list;  
}  
int main()  
{  
    int u;  
    int num[6];  
    int th,tm,ts;       //时间   
    while (~scanf ("%d",&u) && (u>0))  
    {  
        memset (num,0,sizeof (num));  
        for (int i=0;i<u;i++)  
        {  
            scanf ("%d %d:%d:%d",&pre[i].n,&th,&tm,&ts);  
            pre[i].grade=50+pre[i].n*10;  
            pre[i].list=i;  
            pre[i].time=3600*th+60*tm+ts;  
            num[pre[i].n]++;  
        }  
        sort (pre,pre+u,cmp1);  
          
        num[1]/=2;  
        num[2]/=2;  
        num[3]/=2;  
        num[4]/=2;  
        for (int i=0,j=4;i<u;i++)  
        {  
            if (pre[i].n==0 || pre[i].n==5)  
                continue;  
            j=pre[i].n;  
            if (num[j]==0) //作对这个题的有零或一个人 
                continue;  
            else  
            {  
                pre[i].grade+=5;  
                num[j]--;//判断是不是在前一半  
            }  
        }  


        sort (pre,pre+u,cmp2);  
        for (int i=0;i<u;i++)  
        {  
            printf ("%d\n",pre[i].grade);  
        }  
        printf ("\n");  
    }  
    return 0;  
}  

算法2:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{    int m;  //题目数量    char t[10]; //时间     int b;  //题目序号    int s;  //成绩 }p[105];// 先按题目数量进行排序,题目数量相同按时间递增排序 int cmp_1(node x, node y){    if(x.m != y.m)        return x.m > y.m;return strcmp(x.t,y.t) < 0; }int cmp_2(node x, node y){    return x.b < y.b;}int main(){    int arr[10], brr[10];   //记录下相同题目解决的数量, 成绩     int n;    while(~scanf("%d",&n),n+1){        memset(arr,0,sizeof(arr));        memset(brr,0,sizeof(brr));        for(int i = 0;i < n; i++){            scanf("%d %s",&p[i].m,p[i].t);            p[i].b = i;            arr[p[i].m]++;        }        sort(p, p+n, cmp_1);        for(int i = 0;i < n; i++) {            if(p[i].m == 0) {                p[i].s = 50;            }               if(p[i].m == 1) {                brr[1]++;                if(brr[1] <= arr[1]/2) p[i].s = 65;                elsep[i].s = 60;            }            if(p[i].m == 2) {                brr[2]++;                if(brr[2] <= arr[2]/2) p[i].s = 75;                else p[i].s = 70;            }            if(p[i].m == 3) {                brr[3]++;                if(brr[3] <= arr[3]/2)p[i].s = 85;                else p[i].s = 80;            }            if(p[i].m == 4) {                brr[4]++;                if(brr[4] <= arr[4]/2) p[i].s = 95;                else p[i].s = 90;            }            if(p[i].m == 5) p[i].s = 100;        }        sort(p, p+n, cmp_2);        for(int i = 0;i < n; i++)            printf("%d\n",p[i].s);            printf("\n");     } return 0;}
自己当时硬是没想出来怎么做,看看别人的算法才知道算法真是太多了,还是缺乏锻炼啊。

原创粉丝点击