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;
}
posted @ 2022-09-25 11:07  r涤生  阅读(7)  评论(0编辑  收藏  举报