1. 程式人生 > >杭電acm 1084 What Is Your Grade? 比較考人的簡單題

杭電acm 1084 What Is Your Grade? 比較考人的簡單題

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct Point{
      int p;
      int s;
      int pos;
      int t;
};

Point p[105];
int n;
int sum[6],tol[6];

bool cmp1(const Point& lhs,const Point& rhs)//對所有的成員按照解題數從小到大排序,如解題數相同則按照時間從少到多排序
{
      if(lhs.p == rhs.p)
            return lhs.t<rhs.t;
      else
            return lhs.p < rhs.p;
}

bool cmp2(const Point& lhs,const Point& rhs)//按照編號排序
{
      return lhs.pos < rhs.pos;
}

int main()
{
      while(scanf("%d",&n)!=EOF && (n>=0))
      {
            int co,h,m,s;
            memset(sum,0,sizeof(sum));
            memset(tol,0,sizeof(tol));
            for(int i=0;i<n;i++)
            {
                  scanf("%d %d:%d:%d",&co,&h,&m,&s);
                  p[i].pos = i;
                  sum[co]++;//解題數相同的有多少人
                  p[i].p = co;
                  p[i].t = h*3600 + m*60 + s;
            }
            for(int i=1;i<=5;i++)//這是求出解題數少於i道的總人數
            {
                  tol[i] = tol[i-1]+sum[i-1];
            }
            sort(p,p+n,cmp1);
            for(int i=0;i<n;i++)
            {
                  p[i].s = p[i].p*10+50;
                  if(p[i].s == 100 || p[i].s == 50)   continue;
                  if(i-tol[p[i].p] < sum[p[i].p]/2)
                        p[i].s += 5;
            }
            sort(p,p+n,cmp2);
            for(int i=0;i<n;i++)
            {
                  printf("%d\n",p[i].s);
            }
            printf("\n");
      }
      return 0;
}