九度题目1339:ACM
题目1339:ACM(25分)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:599
解决:315
题目描述:
今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名。
ACM组委会把这个任务交给了你,相信你一定能很好地完成。
排名规则如下:通过题的数目多的队伍排名靠前,如果有多支队伍过的题的数目相同
,则罚时少的队伍排名靠前。
输入:
输入的第一行包括一个整数N(1<=N<=100),代表参加比赛的队伍的个数。
接下来的N行每行包括一个字符串和两个整数num,punish,它们之间用空格隔开。其中
,第一个字符串代表参赛的队伍名称(字符串的长度1<=len<=101),num代表这个学校过
了的题目个数(1<=num<=11),punish代表这个学校的罚时(1<=punish<=1000)。
输出:
请按题目描述的规则对所有队伍进行排序,并按照从高到低的顺序对队伍的名称进行输
出。当然可能存在多支队伍,不仅通过题目数量相同,而且罚时相同。虽然这些队伍最
后排名是相同的,但是你输出时需要按照队伍名称的字典序进行输出,比如,队伍aa和
队伍ba,你需要先输出aa,然后输出ba,因为aa的字典序比ba的靠前。
样例输入:
4
RealPlayers 3 100
Potatoes 5 30
blue_sky 7 800
3D_magic_cube 5 50
样例输出:
blue_sky
Potatoes
3D_magic_cube
RealPlayers
sort排序水一下
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct node { char name[200]; int num,punish; }a[200]; int cmp(node x,node y) { if(x.num!=y.num) return x.num>y.num; if(x.punish!=y.punish) return x.punish<y.punish; if(strcmp(x.name,y.name)!=0) return strcmp(x.name,y.name)<0; } int main() { int i,j,n,m; scanf("%d",&n); getchar(); memset(a,0,sizeof(a)); for(i=0;i<n;i++) scanf("%s %d %d",&a[i].name,&a[i].num,&a[i].punish); sort(a,a+n,cmp); for(i=0;i<n;i++) printf("%s\n",a[i].name); return 0; }
最后更新:2017-04-03 12:56:23