您的位置:首页 > 其它

PAT-1027 1028. List Sorting (25)

2018-02-28 12:50 513 查看
题目大意:提供用户个数 N 及 列号 M,提供 N 个用户的编号、姓名、成绩(各为一列,编号唯一),对 M 列进行排序,如果姓名或成绩列相同则按编号从小到大排列。
解题思路:题目的意思和逻辑很简单,不外乎排序 O(nlogn) ,但我的程序最后一组却显示超时,感觉没地儿优化了,难不成来个 基数排序 啊。上网搜集相关优化时发现,这道题卡的竟然是C++的 cout 、cin 效率 较之 C 的 printf、scanf 低。
题目链接:https://www.patest.cn/contests/pat-a-practise/1028#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;

typedef struct Stu
{
char name[9];
int grade,num;
}Stu;
Stu stu[100005];

bool cmp1(Stu x1,Stu x2)
{
if(x1.num < x2.num)
return true;
return false;
}

bool cmp2(Stu x1,Stu x2)
{
if(strcmp(x1.name,x2.name) < 0)
return true;
else if(strcmp(x1.name,x2.name) == 0)
if(x1.num < x2.num)
return true;
return false;
}

bool cmp3(Stu x1,Stu x2)
{
if(x1.grade < x2.grade)
return true;
else if(x1.grade == x2.grade)
if(x1.num < x2.num)
return true;
return false;
}

int main(int argc, char** argv) {
int n,k;
cin >> n >> k;
for(int i=0;i<n;++i)
scanf("%d %s %d",&stu[i].num,stu[i].name,&stu[i].grade);
switch(k)
{
case 1:sort(stu,stu+n,cmp1);break;
case 2:sort(stu,stu+n,cmp2);break;
case 3:sort(stu,stu+n,cmp3);break;
}
for(int i=0;i<n;++i)
printf("%06d %s %d\n",stu[i].num,stu[i].name,stu[i].grade);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: