题解
2026-03-21 18:39:45
发布于:广东
11阅读
0回复
0点赞
贪心策略:短时间优先
排序必须带编号,保证时间相同时小编号在前
关键点:使用结构体
代码如下:
大家就当看个乐子吧qwq
#include <iostream>
#include <algorithm>
#include <iomanip>
//依旧万恶之源头文件
using namespace std;
const int N = 1e5 + 10;
//定义结构体 P,存储每个人的接水时间和原始编号
struct P{
int time , id;//接水时间(time),原始编号(id)(从1开始)
}a[N];
//排序比较函数(其实用重载也不是不行,但是我觉得麻烦)
bool cmp( P a , P b ){
if ( a.time != b.time ){
return a.time < b.time;//如果两个人接水时间不同,则时间小的排在前面
}
return a.id < b.id;//如果接水时间相同,则编号小的排在前面
}
int main(){
//加速 cin/cout 输入输出速度(爱用不用,不用就删掉)
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
//循环输入每个人的接水时间,并赋值原始编号
for( int i = 1 ; i <= n ; i++ ){
cin >> a[i].time;//输入第 i 个人的接水时间
a[i].id = i;//第 i 个人的原始编号就是 i
}
//对 1~n 号人进行排序
sort( a + 1, a + n + 1 , cmp );
//输出排序后的排队编号顺序
for( int i = 1 ; i <= n ; i++ ){
cout << a[i].id << " ";
}
cout << "\n";
//计算总等待时间和平均等待时间
long long time = 0;//总等待时间(开long long纯怕被炸飞)
long long people = 0;//前缀和:前面所有人的接水总时间
//遍历排序后的每个人,累加等待时间
for ( int i = 1 ; i <= n ; i++ ){
time += people;// 当前人的等待时间 = 前面所有人接水总时间
people += a[i].time;// 更新前缀和,加上当前人的接水时间
}
//计算平均等待时间
double cnt = time * 1.0 / n;
//输出平均时间,保留两位小数
cout << fixed << setprecision(2) << cnt << endl;
return 0;
}
这里空空如也





有帮助,赞一个