排队打水2

有N个人排队到M个水龙头去打水,他们装满水桶的时间Tl, T2,…,Tn为整数且各不相等,如何安排他们的打水顺
序才能使他们花费的总时间最少?

Input

第1行: 两个整数n和m, n表示人的个数,m表示水龙头的个数;
第2行, n个数,分别表示n个人装水的时间;
数据范围:m≤n/3, n≤ 1000, t<3000。

Output

一个整数,表示总花费的最少时间。

Sample Input

6 2
5 4 6 2 1 7

Sample Output

40

sol:排队打水的一个变形,贪心策略仍然是按打水时间排序,用时少的先打水,1~m个人第一轮打水,第m+1个人又到第一个水龙头打水,依次分配,计算出总用时。
 1 #include<cstdio>
 2 #include<algorithm>    
 3 using namespace std;
 4 int main()  
 5 {  
 6     int n,m,i,sum=0;  
 7     int a[1001],b[1001];  
 8     scanf("%d%d",&n,&m);  
 9     for(i=1;i<=n;i++)  
10         scanf("%d",&a[i]);  
11     sort(a+1,a+n+1);  
12     for(i=1;i<=m;i++)    
13         b[i]=a[i];  
14     for(i=m;i<=n;i++)  
15         b[i]=b[i-m]+a[i];  
16     for(i=1;i<=n;i++)   
17         sum+=b[i];  
18     printf("%d",sum);    
19 }  

 

 
posted @ 2020-01-02 17:20  蘑菇JJ  阅读(258)  评论(0编辑  收藏  举报