hdu1084

题目链接What Is Your Grade?



解5道题得100分

解4道题,如果你在解四道题的人当中排在前面的一半得95分,否则90分

以此类推

模拟,注意只有一个人解4,3...道题的情况

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

const int maxn=105;

struct node
{
    int num,time,pos,r,score;

}stu[maxn];

bool cmp1(const node &a,const node &b)
{
    if(a.num!=b.num)return a.num>b.num;
    else return a.time<b.time;
}
bool cmp2(const node &a,const node &b)
{
    return a.pos<b.pos;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int N;
    int num,h,m,sec;
    int Rank[6];
    while(scanf("%d",&N)!=EOF&&N!=-1){
        for(int i=0;i<N;i++){
            scanf("%d %d:%d:%d",&num,&h,&m,&sec);
            stu[i].num=num;
            stu[i].time=h*3600+m*60+sec;
            stu[i].pos=i;
        }
        sort(stu,stu+N,cmp1);
        int s=1;num=stu[0].num;stu[0].r=1;
        for(int i=1;i<N;i++){
             if(num==stu[i].num){
                s++;
                stu[i].r=s;
                if(i==N-1){
                    Rank[num]=s;
                    break;
                }
             }
             else{
                Rank[num]=s;
                num=stu[i].num;
                s=1;
                stu[i].r=s;
                if(i==N-1){
                    Rank[num]=s;
                }
             }

        }
        for(int i=0;i<N;i++){
            if(stu[i].num==5)stu[i].score=100;
            else if(stu[i].num==4){
                if(stu[i].r<=Rank[4]/2||Rank[4]==1)stu[i].score=95;
                else stu[i].score=90;
            }
            else if(stu[i].num==3){
                if(stu[i].r<=Rank[3]/2||Rank[3]==1)stu[i].score=85;
                else stu[i].score=80;
            }
            else if(stu[i].num==2){
                if(stu[i].r<=Rank[2]/2||Rank[2]==1)stu[i].score=75;
                else stu[i].score=70;
            }
            else if(stu[i].num==1){
                if(stu[i].r<=Rank[1]/2||Rank[1]==1)stu[i].score=65;
                else stu[i].score=60;
            }
            else stu[i].score=50;
        }
        sort(stu,stu+N,cmp2);
        for(int i=0;i<N;i++){
            printf("%d\n",stu[i].score);
        }
        printf("\n");
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值