藍橋杯 ADV 148 排隊打水問題

2021-09-29 23:33:36 字數 1035 閱讀 1052

問題描述

有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1、t2…………tn為整數且各不相等,應如何安排他們的打水順序才能使他們總共花費的時間最少?

輸入格式

第一行n,r (n<=500,r<=75)

第二行為n個人打水所用的時間ti (ti<=100);

輸出格式

最少的花費時間

樣例輸入

3 21 2 3

樣例輸出

7思路解析

使用貪心策略:即優先讓耗時少的人先打水

為什麼使用這種策略可以得到最優解呢?

打水的情況無非兩種,一種是耗時長的人先打水,一種是耗時短的人先打水。

我們知道,每個人打水花費的總時間s=裝水時間t+等待時間w

不管是哪一種情況,每個人打水的裝水時間是不會變的,情況的不同只影響等待時間的長短,很容易可以看出,裝水時間短的人優先打水,則後續打水的人的等待時間較裝水時間長的人優先打水 更短。

所以,我們採用這樣的策略:優先讓裝水時間短的人先打水。

在程式中,我們使用 t

tt 來記錄每個人的裝水時間,而讓 w

ww 記錄每個人的等待時間,而每個人的等待時間取決於他所在水龍頭中之前所有人的裝水時間,依據這樣的關係,我們可以得到求解的程式。如下:

#include

#include

#include

using

namespace std;

intmain()

sort

(t.begin()

, t.

end())

;// 第一批接水

for(

int i =

0; i < r; i++

)// 後續批次接水

for(

int i = r; i < n; i++

) cout << sum;

return0;

}

藍橋杯 ADV 148 排隊打水問題

演算法提高 排隊打水問題 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1 t2 tn為整數且各不相等,應如何安排他們的打水順序才能使他們總共花費的時間最少?輸入格式 第一行n,r n 500,r 75 第二行為n個人打水所用的時間ti...

2030 排隊打水問題

time limit 3 second memory limit 2 mb 有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1,t2,tn為整數且各不相等,應如何安排他們的打水順序才能使他們花費的總時間最少。輸入檔案兩行 第一行輸入打水人數n,水龍頭數r。用空格隔開 第二行依次輸入n個人的打水時...

2030 排隊打水問題

time limit 3 second memory limit 2 mb 有n個人排隊到r個水龍頭去打水,他們裝滿水桶的時間t1,t2,tn為整數且各不相等,應如何安排他們的打水順序才能使他們花費的總時間最少。輸入檔案兩行 第一行輸入打水人數n,水龍頭數r。用空格隔開 第二行依次輸入n個人的打水時...