排隊打水問題(信息學奧賽一本通貪心算法)



 

題目描述:

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

【算法分析】
 由於排隊時,越靠前面的計算次數越多,因此時間越小的排隊越靠前得出結果越小,所以可以用貪心算法解答。
 步驟如下:
(1)按時間順序從小到大排序(sort函數);
(2)將排序后的時間按順序依次放到每個水龍頭的隊列中;
(3)統計並輸出。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 const int MAXN=1000;
 6 int a[MAXN],s[MAXN];
 7 int main(){
 8     int n,r,j=0,minx=0;
 9     memset(s,0,sizeof(s));
10     cin>>n>>r;    
11     for(int i=0;i<=n;i++)
12         cin>>a[i];
13     sort(a+1,a+n+1);                //對所有的時間排序 
14     for(int i=1;i<=n;i++){
15         j++;
16         if(j==r+1)    
17             j=1;                //前r個人人為一組,第r+1個人回到第一個水龍頭
18         s[j]+=a[i];                //加上等待時間
19         minx+=s[j];             //累加 
20     }
21     cout<<minx<<endl;
22     return 0;
23 } 

 


 相似題目https://www.luogu.com.cn/problem/P1223

 


 

簡單數學證明

摘自:https://www.luogu.com.cn/problemnew/solution/P1223

首先我們要排的是所有的元素,但是為什么是從小到大呢???

排隊總是象征要排序,每個元素在此序列下都要滿足條件,也就是從中拿出兩個相鄰元素同樣滿足條件:

於是設:ai 和 bi且ai<bi

那么針對這兩個元素:就有兩種排列情況:

  1.ai排在bi前面那么有總時間:t1=ai+ai+bi.

  2.bi排在ai前面那么有總時間:t2=bi+bi+ai.

於是由ai<bi得出 t1<t2—》變一下式子—》ai+ai+bi<bi+bi+ai;

再化簡不等式得出ai<bi

於是得出結論:當ai在bi前面時,時間為最小值。

於是反推回總體,兩兩相較,那么越小的應該越排在前面,以至於總時間越小


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM