题目大意:
我们知道,Excel 可以选定某一列关键字进行排序。现在要我们也实现这一功能。
输入n和k,给定你三列数据,分别是唯一的 id(6位字符), name(不超过8位的字符), grade(0~100的证书)。
n 代表有 n 行,k 代表对第 k 列排序。
k == 1:对 id 升序;
k == 2:对 name 升序排列,如果出现同名,根据 id 升序;
k == 3:对 grade 升序排列,如果成绩相同,参考 id 升序。
分析:
用 sort 对结构体排序,重写 cmp 函数。
这个题是 PAT 难得的数据范围比较大的题,N < 1e5。所以我用 cin
交了之后最后一个测试点会 TLE
,所以要将cin cout
改成 scanf printf
。注意点写在注释里了。
满分代码:
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef long long LL;
using namespace std;
const int MAXN = 1e5+10;
/*
1. 当N>1e5 cin一般会超时
2. string不能直接用scanf读入
3. string不能直接用printf输出,要转c_str
*/
struct Node {
string id, name;
int grade;
}stu[MAXN];
bool cmp1(Node a, Node b) {
return a.id < b.id;
}
bool cmp2(Node a, Node b) {
if(a.name != b.name) return a.name < b.name;
else return a.id < b.id;
}
bool cmp3(Node a, Node b) {
if(a.grade != b.grade) return a.grade < b.grade;
else return a.id < b.id;
}
int main() {
// std::ios::sync_with_stdio(false);
int n, k;
scanf("%d %d", &n, &k);
for(int i = 0; i < n; i++) {
// cin >> stu[i].id >> stu[i].name >> stu[i].grade;
int grade;
char id[10], name[10];
scanf("%s %s %d", id, name, &grade);
stu[i] = {id, name, grade};
}
if(k == 1) {
sort(stu, stu + n, cmp1);
} else if(k == 2) {
sort(stu, stu + n, cmp2);
} else if(k == 3) {
sort(stu, stu + n, cmp3);
}
for(int i = 0; i < n; i++) {
// cout << stu[i].id << " " << stu[i].name << " " << stu[i].grade << endl;
printf("%s %s %d\n", stu[i].id.c_str(), stu[i].name.c_str(), stu[i].grade);
}
return 0;
}