排队打水问题(信息学奥赛一本通贪心算法)

浪尽此生 提交于 2020-02-27 11:07:02

 

题目描述:

有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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!