1 条题解
-
0
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { // 读取总人数 int n; cin >> n; // 读取所有同学的积分值 vector<int> scores(n); for (int i = 0; i < n; i++) { cin >> scores[i]; } // 创建一个动态数组,用于按顺序存储已进入教室的同学积分(从小到大排序) vector<int> classroom; // 记录开心同学的数量 int happyCount = 0; // 遍历每位同学 for (int i = 0; i < n; i++) { int currentScore = scores[i]; // 当前同学的积分 // 在已排序的教室数组中查找: // 1. 查找第一个大于或等于当前积分的位置 auto lowPos = lower_bound(classroom.begin(), classroom.end(), currentScore); // 计算积分比当前同学低的人数(在lowPos之前的所有人) int lowerCount = lowPos - classroom.begin(); // 2. 查找第一个大于当前积分的位置 auto highPos = upper_bound(classroom.begin(), classroom.end(), currentScore); // 计算积分比当前同学高的人数(在highPos之后的所有人) int higherCount = classroom.end() - highPos; // 判断是否开心:高积分人数不超过低积分人数 if (higherCount <= lowerCount) { happyCount++; // 开心人数加1 } // 将当前同学插入教室数组的合适位置,保持数组有序 classroom.insert(lowPos, currentScore); } // 输出开心同学的总人数 cout << happyCount << endl; return 0; }
代码解释: 输入部分:
cin >> n; 读取同学总人数
for循环读取每个同学的积分值
核心变量:
classroom:动态数组,存储已进入教室的同学积分(始终保持从小到大排序)
happyCount:记录开心同学的数量
处理每位同学:
currentScore:当前进入教室同学的积分
查找位置:
lower_bound():找到第一个大于或等于当前积分的位置
upper_bound():找到第一个大于当前积分的位置
计算人数:
lowerCount:积分比当前同学低的人数(在lowPos之前的所有人)
higherCount:积分比当前同学高的人数(在highPos之后的所有人)
判断开心条件:if (higherCount <= lowerCount) 如果高积分人数不超过低积分人数,则开心
更新教室:
classroom.insert(lowPos, currentScore); 将当前同学插入到有序数组的正确位置
输出结果:
cout << happyCount; 输出开心同学的总人数
简单说明: 想象同学们一个一个进入教室,每个同学进来时:
先数一数教室里已经有多少人积分比他低(lowerCount)
再数一数有多少人积分比他高(higherCount)
如果高积分人数不超过低积分人数,他就会开心😊
然后这位同学就加入教室,下一个同学继续这个过程
这样一步一步计算,最后就能知道总共有多少同学开心啦!
信息
- ID
- 486
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者