貪心排序不等式-排隊打水

有 n個人排隊到 1 個水龍頭處打水,第 i個人裝滿水桶所需的時間是 ti,請問如何安排他們的打水順序才能使所有人的等待時間之和最小?

思路:

按照從小到大排序,總時間最小

證明:反證法

輸入格式

第一行包含整數 nn。

第二行包含 nn 個整數,其中第 ii 個整數表示第 ii 個人裝滿水桶所花費的時間 titi。

輸出格式

輸出一個整數,表示最小的等待時間之和。

數據範圍

1≤n≤1051≤n≤105,
1≤ti≤1041≤ti≤104

輸入樣例:

7
3 6 1 4 2 5 7

輸出樣例:

56
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int t[N];
int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> t[i];
    sort(t, t + n);
    LL res = 0;
    //這裏注意sort是從小到大排序,最小的應該*最大的值n - 1,所以得倒過來
    for (int i = 0; i < n; i ++) res += t[i] * (n - i - 1);
    cout << res << endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章