题目连接: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;
}