1 条题解
-
0
文字教学
这道题用贪心算法解决,核心思路是让接水时间短的人优先接水,这样能最小化总等待时间(平均等待时间也随之最小):
- 总等待时间的计算:第1个人接水时,后面所有人都要等他的时间;第2个人接水时,后面的人等他的时间……因此要让时间短的人乘上更大的“等待人数系数”。
- 排序规则:先按接水时间从小到大排,时间相同则编号小的排前面。
- 计算总等待时间并求平均,按格式输出即可。
代码
#include <bits/stdc++.h> using namespace std; struct P { int t, id; } p[1005]; int main() { int n; long long sum = 0; cin >> n; for (int i = 0; i < n; ++i) { cin >> p[i].t; p[i].id = i + 1; } // 冒泡排序:按t升序,t相同按id升序 for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - 1 - i; ++j) { if (p[j].t > p[j + 1].t || (p[j].t == p[j + 1].t && p[j].id > p[j + 1].id)) { P tmp = p[j]; p[j] = p[j + 1]; p[j + 1] = tmp; } } } // 输出顺序 for (int i = 0; i < n; ++i) cout << p[i].id << " "; cout << endl; // 计算总等待时间 for (int i = 0; i < n; ++i) sum += (long long)p[i].t * (n - 1 - i); printf("%.2f\n", (double)sum / n); return 0; }
- 1
信息
- ID
- 223
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 12
- 已通过
- 8
- 上传者
京公网安备 11011102002149号