4 5 06:30:17 4 07:31:27 4 08:12:12 4 05:23:13 1 5 06:30:17 -1
100 90 90 95 100
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 100001000
#include<algorithm>
using namespace std;
struct node{
    int n,time;
}a[1005];//记录每个同学的答题状态和所用时间
int main()
{
    int cas,flag5,flag4,flag3,flag2,flag1;//用于统计每个层次的人数
    int s[1005],sa[1005],e[1005],y[1005];//记录每个层次排名前50%的人的位置
    int n,i;
    int l,q,p,k;
    char str[20];
    while(cin>>cas)
    {
        if(cas<0)
            break;
        flag4=flag3=flag2=flag1=0;
        for(i=0;i<cas;i++)
        {
            cin>>a[i].n;
            if(a[i].n==4)
                flag4++;
            else if(a[i].n==3)
                flag3++;
            else if(a[i].n==2)
                flag2++;
            else if(a[i].n==1)
                flag1++;
            cin>>str;
            a[i].time=3600*(10*(str[0]-'0')+str[1]-'0')+60*(10*(str[3]-'0')+str[4]-'0')+10*(str[6]-'0')+str[7]-'0';//全部转化为秒
        }
        if(flag4!=1)
        flag4=(flag4)/2;
        if(flag3!=1)
        flag3=flag3/2;
        if(flag2!=1)
        flag2=flag2/2;
        if(flag1!=1)
        flag1=flag1/2;
        //每个层次只有前一半能拿到该层次的最高分   当每个层次只有一个人的时候那么这个人就能拿到该层次的最高分
        l=0;q=0;p=0;k=0;
        int b;
        int mixn;
        for(i=0;i<cas;i++)  //标记出每个层次排名前50%的人的位置
        {
            if(a[i].n==4&&flag4)
            {
                mixn=a[i].time;
                b=i;
                for(int j=0;j<cas;j++)//每次循环都能找出该层次中用时最少的那个人的位置
                                      //并将其标记且赋一个很大的值保证下次循环不会再被使用
                  {
                    if(a[j].n==4&&a[j].time<mixn)
                       {
                           mixn=a[j].time;
                           b=j;
                       }
                  }
                       s[l++]=b;
                       a[b].time=M;
                       flag4--;
            }
            if(a[i].n==3&&flag3)
            {
                  mixn=a[i].time;
                  b=i;
                  for(int j=0;j<cas;j++)
                  {
                      if(a[j].n==3&&a[j].time<mixn)
                       {
                        mixn=a[j].time;
                        b=j;
                       }
                   }
                   sa[q++]=b;
                   a[b].time=M;
                   flag3--;
            }
            if(a[i].n==2&&flag2)
            {
                mixn=a[i].time;
                b=i;
                for(int j=0;j<cas;j++)
                   {
                       if(a[j].n==2&&a[j].time<mixn)
                       {
                        mixn=a[j].time;
                          b=j;
                       }
                   }
                    e[p++]=b;
                    a[b].time=M;
                    flag2--;
            }
              if(a[i].n==1&&flag1)
            {
                mixn=a[i].time;
                b=i;
                for(int j=0;j<cas;j++)
                   {
                       if(a[j].n==1&&a[j].time<mixn)
                       {
                        mixn=a[j].time;
                          b=j;
                       }
                   }
                    y[k++]=b;
                    a[b].time=M;
                    flag1--;
            }
        }
        for(i=0;i<cas;i++)//输出
        {
            if(a[i].n==5)
                cout<<"100"<<endl;
            else if(a[i].n==4)
            {
                flag4=0;//前面的flag在后面没有用了所以偷了点懒重新利用了一下用于标记该同学的排名是否是他所处层次的前50%
                for(int j=0;j<l;j++)
                  {
                     if(s[j]==i)
                      {
                        cout<<"95"<<endl;
                        flag4=1;
                        break;
                      }
                 }
                if(!flag4)
                    {
                       cout<<"90"<<endl;
                    }
            }
             else if(a[i].n==3)
            {
                flag3=0;
                for(int j=0;j<q;j++)
               {
                   if(sa[j]==i)
                    {
                        cout<<"85"<<endl;
                        flag3=1;
                        break;
                    }
               }
               if(!flag3)
                    {
                        cout<<"80"<<endl;
                    }
            }
             else if(a[i].n==2)
            {
                flag2=0;
                for(int j=0;j<p;j++)
               {
                    if(e[j]==i)
                    {
                        cout<<"75"<<endl;
                        flag2=1;
                        break;
                    }
               }
                 if(!flag2)
                    {
                        cout<<"70"<<endl;
                    }
            }
             else if(a[i].n==1)
            {
                flag3=0;
                for(int j=0;j<k;j++)
                {
                    if(y[j]==i)
                    {
                        cout<<"65"<<endl;
                        flag3=1;
                        break;
                    }
                }
                if(!flag3)
                {
                    cout<<"60"<<endl;
                }
            }
            else
                cout<<"50"<<endl;
        }
        cout<<endl;
    }
    return 0;
}
hdu 1084 What Is Your Grade?,布布扣,bubuko.com
原文地址:http://blog.csdn.net/fanerxiaoqinnian/article/details/38262259