【链接】nbu1715点击打开链接
【题目】
J__恶魔猎手的庆功宴
Time Limit:1000MS Memory Limit:65536K
Description
恶魔猎手战胜了死亡骑士之后,救出了泰兰德,世界迎来了久违的和平,他成了人们的大英雄。
现在他准备开个庆功宴。
他的每个战士将会按照那场战役中的杀敌数和来到这支队伍的时间被排好一个序,来接受恶魔猎手的嘉奖。每个战士先按照杀敌数降序排序,在杀敌数相同的情况下按照来到部队的时间升序排序,若时间也相同按在输入中出现的先后排序。
庆功宴以后,恶魔猎手带着泰兰德浪迹天涯,他们从此过上了幸福的生活。
Input
数据有多组。
每组n+1行。
第一行是整数n(100000>=n>=1),代表战士人数。
接下来n行是每个战士的信息,包括名字,杀敌数,还有来到部队的时间。
其中名字为不超过10个字符的无空格字符串;0<=杀敌数<=32767;12>=时间>=1,时间为整数代表月份;
Output
对应每组输出排好序后的名单,包括n+1行。
第一行是战士个数,接下来n行是排好序后的战士的信息。
Sample Input
7
wubin 4 7
tracy_zhu 6 1
LYF 5 3
emerson 6 1
xiaocai 4 2
ZCH 5 2
feixiete 4 12
Sample Output
7
tracy_zhu 6 1
emerson 6 1
ZCH 5 2
LYF 5 3
xiaocai 4 2
wubin 4 7
feixiete 4 12
【算法】
这个题目纠结了一下,开始的时候结构体里没有int num;这一条,然后就WA了两次。
请教学长,学长说快排是不稳定的,这个是速度快的代价,不稳定是说权值相同的时候可能会破坏原来的顺序,在结构体里加一个变量表示下标就好了,权值全部相同的时候按下标排,下标是肯定不相同。
若时间也相同按在输入中出现的先后排序这一句说明要稳定排序。
另外把a.kill==b.kill写成a.kill=b.kill也纠结了一下,小错误要谨慎再谨慎。
快排不要稳定排序的时候还是可以很信任的,然后就是要多学会几种排序的方法了。
【代码】
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef struct aa
{
char name[11];
int kill;
int time;
int num;
}B;
B A[100001];
bool cmp(B a,B b)
{
if(a.kill==b.kill&&a.time==b.time) return a.num<b.num;
else if(a.kill==b.kill) return a.time<b.time;
else return a.kill>b.kill;
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%s%d%d",A[i].name,&A[i].kill,&A[i].time);
A[i].num=i;
}
sort(A,A+n,cmp);
printf("%d\n",n);
for(i=0;i<n;i++)
printf("%s %d %d\n",A[i].name,A[i].kill,A[i].time);
}
return 0;
}