知识点
- 构造sort的排序函数时,string类型可直接比较大小
- 面对函数的栈器存储空间有限,当出现栈溢出问题时,可将变量命名为全局变量。
- 测试点2、3、4错误的原因,第一次误以为是由于数据过大,导致long long类型溢出,无法成功比较大小,然换成string后问题依旧,仔细排查后第三类人的判断出了问题,正确语句如下
- stu[i].virture >= L && stu[i].talent >= L && stu[i].virture >= stu[i].talent
- 代码可以继续精简,如一开始就可以进行分类,无需先用stu进行存储浪费存储空间,此外,cmp函数部分可以写的更为简洁
/*
* PAT (Basic Level) Practice (中文)
* 1015 德才论 (25分)
* 2021.1.13
* 主要考察sort的用法
*/
# include<iostream>
# include<algorithm>
using namespace std;
struct student {
long long id;
int virture;
int talent;
}stu[100001];
void output(student out[100001], int num) {
for (int i = 0; i < num; i++) {
cout << out[i].id << " " << out[i].virture << " " << out[i].talent << endl;
}
}
bool cmp(student x, student y) {
if (x.talent + x.virture > y.talent + y.virture)
return true;
else if (x.talent + x.virture == y.talent + y.virture) {
if (x.virture > y.virture)
return true;
else if (x.virture == y.virture) {
if (x.id < y.id)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
int main() {
int N, L, H;
cin >> N >> L >> H;
int out_num = 0; // 用于输出及格人数的变量
// 录入考生信息,进行处理
for (int i = 0; i < N; i++) {
cin >> stu[i].id >> stu[i].virture >> stu[i].talent;
if (stu[i].virture >= L && stu[i].talent >= L)
out_num++;
else {
i--; //由于输出时,无需不及格的学生,故直接用i--的方式覆盖掉
N--;
}
}
int cnt[4] = { 0 }; // 分类学生时所用计数器
student stu1[100001], stu2[100001], stu3[100001], stu4[100001];
for (int i = 0; i < out_num; i++) {
if (stu[i].virture >= H && stu[i].talent >= H) {
stu1[cnt[0]].id = stu[i].id;
stu1[cnt[0]].virture = stu[i].virture;
stu1[cnt[0]].talent = stu[i].talent;
cnt[0]++;
}else if (stu[i].virture >= H && stu[i].talent >= L) {
stu2[cnt[1]].id = stu[i].id;
stu2[cnt[1]].virture = stu[i].virture;
stu2[cnt[1]].talent = stu[i].talent;
cnt[1]++;
}
else if (stu[i].virture >= L && stu[i].talent >= L && stu[i].virture >= stu[i].talent) {
stu3[cnt[2]].id = stu[i].id;
stu3[cnt[2]].virture = stu[i].virture;
stu3[cnt[2]].talent = stu[i].talent;
cnt[2]++;
}
else {
stu4[cnt[3]].id = stu[i].id;
stu4[cnt[3]].virture = stu[i].virture;
stu4[cnt[3]].talent = stu[i].talent;
cnt[3]++;
}
}
sort(stu1, stu1 + cnt[0], cmp);
sort(stu2, stu2 + cnt[1], cmp);
sort(stu3, stu3 + cnt[2], cmp);
sort(stu4, stu4 + cnt[3], cmp);
cout << out_num << endl;
output(stu1, cnt[0]);
output(stu2, cnt[1]);
output(stu3, cnt[2]);
output(stu4, cnt[3]);
return 0;
}