主要内容 #
- 问题描述
- 算法思路
- 参考程序
1. 问题描述 #
有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?
输入格式
第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);
输出格式
最少的花费时间
样例输入
3 2
1 2 3
样例输出
7
2. 算法思路 #
这道题最后要求
花费的时间=每个人接水的时间+每个人排队等待的时间
确定了这个就很好求了
这个题的贪心策略:
因为每个人的接水时间已经是固定的了,那么要确定最少的花费时间
就取决于让每个人排队等待的时间最少
这样让接水时间少的人先接,就能保证后面排队的人用时最短。
(1)将输入的时间按照从小到大排序;
(2)将排序后的时间按找顺序依次放入每个水龙头的队列中;
(3)统计,输出答案。
3. 参考程序 #
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int main() { int n,r,sum=0; //人数,水龙头数 int s[5000],arr[5000]; //装满水桶的时间 memset(s,0,sizeof(s)); //初始化 cin >> n >> r; for(int i=1; i<=n; i++) cin >> arr[i]; sort(arr+1,arr+1+n); //从小到大排序 int k=0; for(int i=1;i<=n;i++) { k++; if(k==r+1) //r人一组,第r+1个人回到第一个龙头 k=1; s[k] += arr[i];//加上等待时间 sum += s[k];//累加 } cout << sum << endl; return 0; }