PS:入坑一个半月的蒟蒻的第一篇题解有错误欢迎指出
题目描述
有 n 个人排队到 1 个水龙头处打水,第 i 个人装满水桶所需的时间是 ti,请问如何安排他们的打水顺序才能使所有人的等待时间之和最小?
输入格式
第一行包含整数 n。
第二行包含 n 个整数,其中第 i 个整数表示第 i 个人装满水桶所花费的时间 ti。
输出格式
输出一个整数,表示最小的等待时间之和。
数据范围
1≤n≤105,
1≤ti≤104
输入样例:
7
3 6 1 4 2 5 7
输出样例:
56
// 翻译一下题目就是每次找最打水时间最小的去乘打水的总人数,然后依次相加。
这样可以完美用小根堆的思想来做
代码如下
#include<iostream>
#include<queue>
using namespace std;
const int N = 10010;
int a[N] ;
int n ;
int main()
{
cin >> n ;
priority_queue<int, vector<int>, greater<int>> q; // 先定义一个小根堆
//实际上就是优先队列的从小到大排序
for(int i = 0 ; i < n ; i++) // 依次插入数据
{
int x ;
cin >> x;
q.push(x);
}
long long ans = 0 ; // 定义最后输出的结果
while(q.size()) // 只要还有排队打水的人 等同于while(q.size() != 0)
{
int a = q.top(); // 让a等于打水时间最小的
q.pop(); // 将其弹出
ans += a * q.size() ; // 计算结果 :打水时间最小的去乘打水的总人数
}
cout << ans ; // 输出结果
return 0 ; // 别忘记return !!!
}
《入坑一个月的蒟蒻》
捕捉大佬