PAT 甲级 1028 List Sorting (25分)

原题链接1028 List Sorting (25分)

题目大意:

我们知道,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;
}


上一篇:CF-911E.Stack Sorting(栈)


下一篇:【运维】Linux进阶命令简记--Linux(3)