题目描述
图书评选活动结束后,一年一度的射击比赛也如期举行了。这一天N名选手(编号为1到N)聚集在操场上准备比赛,M个射击靶排成一行立在操场上,选手需要从左到右射击每一个靶,每个靶的得分范围是1到9,如果脱靶了,那么这个靶的得分就没有。而一个选手的最终得分就是从左到右M个射击靶的得分组成的一个数字串。
例如M=10时表示一共10个射击靶,某个选手从左到右每个射击靶的得分分别是:9,8,7,6,3,2,1,1,9,7,3,那么这个选手的最终得分就是9863211973,而另一个选手的得分可能是987632187,长度只有8位,因为有两个靶是脱靶的没有得分。
现按照编号从小到大的给出N名选手的姓名及最终得分。请你帮忙完成N名选手的排名,先按照得分从高到低排序,如果多个选手得分相同则名字字典序小的排在前,如果名字也相同则选手编号小的排在前。
输入格式
第一行,用空格隔开的两个整数N和M,分别表示参赛的选手数量以及射击靶的数量。
接下来N,按照编号从小到大给出每个选手的信息,第一个选手的编号是1,依次类推。每一行先给出一个选手的姓名,姓名是不超过30个英文字母组成的字符串,接着给出这个选手的最终得分,得分是不超过M个数字组成的数字串,姓名和得分之间用一个空格隔开。
输出格式
输出有N行,按照排名从前往后输出每个选手的信息。
每行先输出一个整数,表示排在第i位的选手的编号,再输出一个字符串表示这个选手的姓名。
输入输出样例
输入样例1:
5 5
lily 98765
joe 98765
lily 98765
mary 9876
john 8876
输出样例1:
2 joe
1 lily
3 lily
4 mary
5 john
说明
【数据范围】:
50%的数据:1<M<10,1<N<100。
80%的数据:1<M<100,1<N<500。
100%的数据:1<M<500,1<N<1000。
提示:注意射击分数的比较;分数111是大于分数99的!
【耗时限制】1000ms 【内存限制】128MB
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
using namespace std;
struct student
{
string score,name;
int hao;
}stu[1510];
bool cmp(const student &stu1,const student &stu2)
{
if(stu1.score.size()!=stu2.score.size())
{
return stu1.score.size()>stu2.score.size();
}
if(stu1.score!=stu2.score)
{
return stu1.score>stu2.score;
}
if(stu1.name!=stu2.name)
{
return stu1.name<stu2.name;
}
return stu1.hao<stu2.hao;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
stu[i].hao=i;
cin>>stu[i].name>>stu[i].score;
}
sort(stu+1,stu+n+1,cmp);
for(int i=1;i<=n;i++)
{
cout<<stu[i].hao<<" "<<stu[i].name<<endl;
}
return 0;
}