1. 题目:[P1093 NOIP2007 普及组] 奖学金
📝 我的代码 (AC Version)
c++
#include<bits/stdc++.h>
using namespace std;
// 1. 定义结构体存储多维度数据
struct student {
int Chinese;
int Math;
int English;
int Sum;
int Number;
} a[305]; // 数组开大 5 个空间防止越界
// 2. 核心排序逻辑:自定义比较函数
bool comp(student xx, student yy) {
// 优先级 1:总分大的在前 (降序)
if (xx.Sum != yy.Sum)
return xx.Sum > yy.Sum;
// 优先级 2:总分一样,语文大的在前 (降序)
if (xx.Chinese != yy.Chinese)
return xx.Chinese > yy.Chinese;
// 优先级 3:都一样,编号小的在前 (升序)
return xx.Number < yy.Number;
}
int n;
int main() {
// 优化输入输出效率
ios::sync_with_stdio(0), cin.tie(0);
if (!(cin >> n)) return 0;
for (int i = 1; i <= n; i++) {
cin >> a[i].Chinese >> a[i].Math >> a[i].English;
a[i].Sum = a[i].Chinese + a[i].Math + a[i].English;
a[i].Number = i;
}
// 3. 调用 STL sort 函数 (左闭右开区间)
sort(a + 1, a + n + 1, comp);
// 4. 严格按题目要求格式输出
for (int i = 1; i <= 5; i++) {
cout << a[i].Number << " " << a[i].Sum << endl;
}
return 0;
}
🎯 核心考点说明
1. 结构体 (struct) 的应用
- 适用场景:当一个物体(如学生)有多个属性(姓名、成绩、学号)且这些属性需要"绑定"在一起排序时,必须使用结构体。
- 定义技巧 :
struct 类型名 { 成员列表 } 变量名[大小];。
2. STL sort 与自定义 comp 函数
- sort 语法 :
sort(起始地址, 结束地址, 比较规则); - 左闭右开 :排
a[1]到a[n],参数是a + 1和a + n + 1。 - 比较逻辑 :
comp返回true代表第一个参数应该排在前面。
3. 多级排序逻辑
- 采用
if-else或if过滤法:先判断最重要的条件,如果不相等直接返回;如果相等,再进入下一级条件的判断。
⚠️ 注意事项
- 头文件 :使用
#include <bits/stdc++.h>可以省去记各种库的麻烦。 - IO 优化 :
ios::sync_with_stdio(0), cin.tie(0);是蓝桥杯大题必加项,防止在大规模数据下超时。 - 数组大小 :题目给出 N ≤ 300 N \le 300 N≤300,数组开
305是一种防御性编程习惯,避免i+1等操作导致越界。
❌ 我犯的错误 (避坑指南)
- 语法细节错误 :
for循环括号内误用逗号,,应使用分号;。cout流向写反(误写为>>),正确应为<<。
- 输出格式错误 (WA 的主要原因) :
- 多余空格 :在两个输出变量之间加了多个空格。判题机对空格极其敏感,必须严格按照题目要求的"一个空格"输出。
- 特殊字符:从网页复制粘贴可能带有不可见的特殊编码字符,导致判题失败。建议引号内的内容手动输入。
- 逻辑遗漏 :
- 忘记了题目要求只输出"前 5 名",最初代码缺少了输出限制循环。