acwing913. 排队打水
acwing913. 排队打水
原题链接:https://www.acwing.com/problem/content/description/915/
思路
贪心的题:1.猜想 2.证明自己的猜想
猜想:所有数从小到大排序,总的等待时间最小
证明:
反证法 =>
有时间t1 t2 t3 ... tn
总时间为 t[1] * (n-1) + t[2] * (n-2) + ...
t[i] > t[i+1]
如果没有按照从小到大排序,t[i]在t[i+1]前面
交换前后不同的只有等待这两个人的时间有变化,等待其他人的时间不变
交换之前: t[i]*(n-i)+t[i+1]*(n-i-1)
交换之后:t[i+1]*(n-i)+t[i]*(n-i-1)
两者做差(前-后) => t[i]*(n-i-n+i+1) + t[i+1]*(n-i-1-n+i)
=> t[i] - t[i+1] > 0
=> 因此交换之后总的等待时间最小
所以从小到大排序总的等待时间最小
1.从小到大排序
2.求等待时间
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int a[N];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a,a+n);
LL res = 0;
for(int i = 0; i < n; i ++) res += a[i]*(n-i-1);
cout << res;
return 0;
}
rds_blogs