C++ 算法考级专栏
真题分析、矩阵探测、递归回溯与基础语法
🎨 视觉封面【GESP】C++四级/五级练习题 luogu-P1223 排队接水
GESP C++ 四级/五级练习题,贪心思想思想考点。题目难度⭐⭐★☆☆,适合五级入门和四级练习,洛谷难度等级普及-。
luogu-P1223 排队接水
题目要求
题目描述
有 个人在一个水龙头前排队接水,假如每个人接水的时间为 ,请编程找出这 个人排队的一种顺序,使得 个人的平均等待时间最小。
一个人的等待时间不包括他的接水时间。
如果两个人接水的时间相同,编号更小的人应当排在前面。
输入格式
第一行为一个整数 。
第二行 个整数,第 个整数 表示第 个人的接水时间 。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例 #1
输入 #1
10
56 12 1 99 1000 234 33 55 99 812
输出 #1
3 2 7 8 1 4 9 6 10 5
291.90
说明/提示
,,不保证 不重复。
题目分析
这是一道典型的贪心算法题目。
1. 问题分析
题目要求使 个人的平均等待时间最小。因为 是固定的,要使平均值最小,实际上就是要使总等待时间最小。
假设 个人按某个顺序排队,接水时间分别为 。
- 第 1 个人接水时,后面 个人在等待,耗时 。
- 第 2 个人接水时,后面 个人在等待,耗时 。
- ...
- 第 个人接水时,后面 个人在等待,耗时 。
总等待时间 。
2. 贪心策略
观察公式可以发现,越靠前的人,其接水时间 被计算的次数越多(系数 越大)。为了让总和 最小,我们需要让耗时短的人排在前面,耗时长的人排在后面。即:按接水时间从小到大排序。
3. 细节处理
- 排序规则:题目要求“如果两个人接水的时间相同,编号更小的人应当排在前面”。因此在排序比较函数中,除了比较时间
time,还要处理time相等时比较id的情况。 - 数据范围:。总等待时间可能会达到 ,超过了
int的表示范围(约 ),因此累加变量sum必须使用long long类型。 - 输出格式:平均等待时间需要保留两位小数,可以使用
printf("%.2f", ...)或fixed+setprecision(2)。
示例代码
#include <algorithm>
#include <iomanip>
#include <iostream>
typedef long long ll;
// 定义结构体Water,用于存储每个人的编号和接水时间
struct Water {
int id; // 人的编号
int time; // 接水所需时间
};
// 比较函数:按照接水时间从小到大排序
// 如果接水时间相同,则按照编号从小到大排序
bool cmp(Water a, Water b) {
if (a.time == b.time) {
return a.id < b.id;
}
return a.time < b.time;
}
struct Water t[1005]; // 数组大小大于1000,符合题目范围
int main() {
int n;
std::cin >> n;
for (int i = 1; i <= n; i++) {
t[i].id = i; // 记录初始编号
std::cin >> t[i].time; // 输入接水时间
}
// 贪心策略:接水时间越短的人排在越前面,能使后续所有人的等待时间总和最小
std::sort(t + 1, t + n + 1, cmp);
ll sum = 0;
for (int i = 1; i <= n; i++) {
std::cout << t[i].id << " ";
// 计算总等待时间:
// 第i个人接水时,排在他后面的 n-i 个人都在等待
// 因此第i个人的时间贡献了 (n-i) 次等待
sum += t[i].time * (n - i);
}
std::cout << "\n";
// 输出平均等待时间,保留两位小数
std::cout << std::setprecision(2) << std::fixed << (double)sum / n;
return 0;
}
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
猜你想读 · 相关文章推荐
【GESP】C++四级真题 luogu-B3928 [GESP202312 四级] 田忌赛马
GESP C++四级2023年12月真题。本题为一维数组和排序的应用练习,难度⭐⭐★☆☆。本题在洛谷评定为普及-。 本质上说,这里的算法策略采用的是贪心策略,属于GESP五级的内容,但是作为四级考生,在忽略所谓对贪心策略理解的情况下,也可以通过自己的思考解决。
【GESP】C++四级真题 luogu-B3851 [GESP202306 四级] 图像压缩
GESP C++四级真题,函数、结构体、多维数组等应用练习,难度⭐⭐⭐☆☆。个人认为23年GESP考试设立初期各级考试的题难度都不小,本题应该是四级真题中难度较大的一个。在洛谷也是评定为普及/提高。
【GESP】C++四级真题 luogu-B3959 [GESP202403 四级] 做题
GESP C++四级2024年3月真题。本题主要考察排序操作。难度不大⭐⭐★☆☆。本题在洛谷评定为普及-。
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com