Description
校赛结束了,每一个参赛选手由3个数据项构成(通过题数,用时分钟数,姓名),排名按照通过题数排序 通过题数多的排前,同题数的,罚时少的排前。如果题数相同,罚时也相同,而按数据读取的先后排。 给你N个参赛选手的数据,按排序先后,输出姓名
输入格式
第一个数为N,(N<=500000) 此后,每行一个参赛选手的数据,通过题数,用时分钟数,姓名,前两者为整型数,姓名为字符串(不多于20个字符)
输出格式
姓名排名
输入样例
4 3 5 Jon 5 100 Smith 3 5 Tom 6 95 Hel
输出样例
Hel Smith Jon Tom
提示
由于有500000个数据,输入和输出务必使用scanf和printf
思路
自定义规则排序
代码
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
#include <vector>
using namespace std;
typedef struct man{
int num;
int time;
int list;
char name[21];
}man;
bool rule(man a1, man a2) {
if(a1.num > a2.num){
return true;
}else if(a1.num < a2.num ){
return false;
}else{
if(a1.time < a2.time){
return true;
}else if(a1.time > a2.time){
return false;
}else{
if(a1.list < a2.list)
return true;
else
return false;
}
}
}
int main()
{
// freopen("case.txt","r",stdin);
int n, i;
scanf("%d",&n);
// man a[n+5];//数据过大,栈放不下
man *a = new man[n+5];
for(i=0; i<n; ++i){
scanf("%d%d%s",&a[i].num,&a[i].time,a[i].name);
a[i].list = i;
}
sort(a,a+n,rule);
for(int i=0; i<n; ++i){
printf("%s\n",a[i].name);
}
return 0;
}
存在BUG
a [ n+5 ] 数组在函数内无法AC
解决方法
用 vector ,或将 a 数组声明为全局变量,或改用指针。
原因
main函数的栈放不下这么大的数据