題目描述:
有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前面時,時間為最小值。
於是反推回總體,兩兩相較,那么越小的應該越排在前面,以至於總時間越小