跳转至

一本通-1319:【例6.1】排队接水(贪心)

【题目描述】

有n个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。

【输入】

共两行,第一行为n(1≤n≤1000);第二行分别表示第1个人到第n个人每人的接水时间T1,T2,…,Tn,每个数据之间有1个空格。

【输出】

有两行,第一行为一种排队顺序,即1到n的一种排列;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。

【输入样例】

10                          
56 12 1 99 1000 234 33 55 99 812

【输出样例】

3 2 7 8 1 4 9 6 10 5
291.90

#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <string>
#include <climits>
#include <cstdio>
#include <queue>
#include <algorithm>

using namespace std;

const int INF = 0x0ffffff;

struct Node
{
    int number, value;
    bool operator<(const Node & obj) const
    {
        return value < obj.value;
    }
};

int n = 1005;
vector<Node> sequence(n);

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> sequence[i].value;
        sequence[i].number = i;
    }
    sort(sequence.begin() + 1, sequence.begin() + 1 + n);

    int sum = 0;
    for (int i = 1; i <= n - 1; ++i) {
        cout << sequence[i].number << " ";
        sum += (n - i) * sequence[i].value;
    }
    cout << sequence[n].number << endl;
    cout << fixed << setprecision(2) << (sum * 1.0) / n << endl;

    return 0;
}
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <string>
#include <climits>
#include <cstdio>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <set>
#include <algorithm>

using namespace std;

struct Node
{
    long long waterTime;
    int number;

    bool operator<(const Node & obj) const
    {
        return waterTime < obj.waterTime;
    }
};

int n;
vector<Node> seq(1005);

void solve()
{
    sort(seq.begin(), seq.begin() + n);

    long long totalWait = 0, personalWait = 0;

    cout << seq[0].number << ' ';
    for (int i = 1; i < n; ++i) {
        cout << seq[i].number;
        if (i != n - 1) cout << ' ';

        personalWait += seq[i - 1].waterTime;
        totalWait += personalWait;
    }
    cout << endl;

    cout << fixed << setprecision(2) << (totalWait * 1.0) / n << endl;
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> seq[i].waterTime;
        seq[i].number = i + 1;
    }

    solve();

    return 0;
}