北大1918题

来源:互联网 发布:卖淘宝小号的交易平台 编辑:程序博客网 时间:2024/05/17 04:14

 题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1918

1,排名关键字:正解数count降序、时间time升序、队名name升序

2,时间time计算:time = f_time+错态提交次数*20

3,名次调整:rank=1开始,所有具有相同名次的具有相同rank,下一个名次的为当前rank加已赋值有名次的人的数目

4,最后还涉及到输出的格式化

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

class Team
{
public:
 char name[10];
 int solved[10];
 int count;
 int time;
 int rank;
 bool operator < (const Team& t)
 {
  if(count > t.count)
   return true;
  if(count == t.count)
   if(time < t.time)
    return true;
   if(count == t.count && time == t.time)
    return strcmp(name,t.name) < 0;
   return false;
 }
};

int ID(Team team[10],int n,char* name)
{
 int i;
 for(i = 0;i < n;++i)
  if(strcmp(team[i].name,name) == 0)
   return i;
}
int main()
{
 freopen("in.txt","r",stdin);

 Team team[20];
 char state[5],name[10];
 int i,j,test,tnum,pnum,snum,pid,tid,time,r,rank;
 cin >> test;
 while(test--)
 {
  memset(team,0,sizeof(team));
  cin >> tnum;
  for(i = 0;i < tnum;++i)
   cin >> team[i].name;
  cin >> pnum >> snum;
  for(i = 0;i < snum;++i)
  {
   cin >> pid >> time >> state >> name;
   tid = ID(team,tnum,name);
   if(team[tid].solved[pid] != -1)
   {
    if(state[0] == 'Y')
    {
     ++team[tid].count;
     team[tid].time += time;
     team[tid].time += 20 * team[tid].solved[pid];
     team[tid].solved[pid] = -1;
    }
    else
     ++team[tid].solved[pid];
   }
  }
  sort(team,team + tnum);
  for(rank = 1,i = 0;i < tnum;)
  {
   r = rank;
   for(j = i;team[i].count == team[j].count && team[i].time == team[j].time
    && j < tnum;++j)
   {
    team[j].rank = r;
    ++rank;
   }
   i = j;
  }
  for(i = 0;i < tnum;++i)
   printf("%2d. %-8s %d %4d/n",team[i].rank,team[i].name,team[i].count,team[i].time);
  printf("/n");
 }
 return 0;
}