ACM比赛排名
Time Limit: 1000 ms
Memory Limit: 65535 kB
Description
我们知道,每一年的ACM/ICPC亚洲地区现场赛赛都会有很多很多个代表队 参赛,于是,怎么把这些队伍排序成了组织者最头疼的问题。后来,他们终于 想出了解决方案,那就是——按照网络赛的做题数排序,如果做题数一样再按 罚时排序,如果罚时又是一样的,那就只能按照学校名字的字典序排序了
他们规定:
1、做题数多的排在前面;
2、罚时少的排在前面
3、名字按字母ASCII码值升序排列,如果第一个字母一样就比较第二个字 母,以此类推
Input
Line 1:一个数N(1<= N <= 500),代表进入现场赛的学校数
Line 2 - N + 1:队伍的名字(不含空格,由大小写字母组成,长度不超过50)、做题数(正整数)、罚时(正整数)
输入数据保证不出现三者完全一样的数据
Output
按输入的格式把队伍排序后输出,case之间输出空行
Sample Input
2
TeamA 3 200
TeamB 4 500
Sample Output
TeamB 4 500
TeamA 3 200
这题考的是结构体排序,可以写一个低效的冒泡排序什么的,这里用的是algorithm头文件中的sort算法。
下面是一篇写qsort和sort使用的文章,http://wenku.baidu.com/view/667c03c10c22590102029d7a.html
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef struct TeamInformation
{
char name[55];
int rightNums;
int totalTime;
}TeamInformation;
bool cmp( TeamInformation teamA, TeamInformation teamB)
{
if ( teamA.rightNums > teamB.rightNums )
{
return true;
}
if ( teamA.rightNums < teamB.rightNums )
{
return false;
}
if ( teamA.totalTime < teamB.totalTime )
{
return true;
}
if ( teamA.totalTime > teamB.totalTime )
{
return false;
}
if ( strcmp(teamA.name, teamB.name) < 0 )
{
return true;
}
return false;
}
int main()
{
int N;
FILE * fin, * fout;
fin = fopen("1.std.in", "r");
fout = fopen("1.std.out", "w");
TeamInformation teams[510];
fscanf(fin, "%d", &N);
for ( int i = 0; i < N; i++ )
{
fscanf(fin, "%s %d %d", teams[i].name, &teams[i].rightNums, &teams[i].totalTime);
}
sort(teams, teams + N, cmp);
for ( int i = 0; i < N; i++ )
{
fprintf(fout, "%s %d %d\n", teams[i].name, teams[i].rightNums, teams[i].totalTime);
}
return 0;
}