【洛谷刷题笔记】P1223 排队接水

一、题目:

排队接水

题目描述

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

输入格式

第一行为一个整数 $n$。

第二行 $n$ 个整数,第 $i$ 个整数 $T_i$ 表示第 $i$ 个人的等待时间 $T_i$。

输出格式

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

样例 #1

样例输入 #1

10 
56 12 1 99 1000 234 33 55 99 812

样例输出 #1

3 2 7 8 1 4 9 6 10 5
291.90

提示

$1\le n \leq 1000$,$1\le t_i \leq 10^6$,不保证 $t_i$ 不重复。

二、思路:

很显然的时间越大越靠后
易错点:正在打水的人不算等待

for (int i = 1; i <= n; i++) {
sum += term;//注意正在打水的人不算等,所以先加SUM
term += arr[i][0];
}
//为什么正在打水就不算等呢?

三、源码:

#include <iostream>
#include <algorithm>
using namespace std;

#define N 5001
int arr[N][2];//用二维数组的第一个数存这个数,第二个数存一开始的序号

int main() {
    int n;
    int term = 0;
    double ave = 0, sum = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i][0];
        arr[i][1] = i;
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n - i; j++) {
            if (arr[j][0] > arr[j + 1][0]) {
                swap(arr[j][0], arr[j + 1][0]);
                swap(arr[j][1], arr[j + 1][1]);
            }
        }
    }

    for (int i = 1; i <= n; i++) {
        sum += term;//注意正在打水的人不算等,所以先加SUM
        term += arr[i][0];
    }
    for (int i = 1; i <= n; i++) {
        cout << arr[i][1] << " ";
    }
    cout << endl;
    ave = sum / n;
    printf("%.2lf", ave);
    return 0
}

欢迎改正与补充

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇