首页 > 代码库 > 排队打水问题

排队打水问题

排队打水问题
Time Limit:1000MS Memory Limit:65536K

Description

有n个人排队到r个水龙头去打水,他们装满水桶的时间t1、t2………..tn为
整数且各不相等,应如何安排他们的打水顺序才能使他们总共花费的时间最少?

Input

第一行n,r (n<=500,r<=75)
第二行为n个人打水所用的时间Ti (Ti<=100);

Output

最少的花费时间

Sample Input

3 2
1 2 3

Sample Output

7

解题思路:
//思路:用贪心算法,每次让用时最少的r个人分别去r个水龙头去打水
//总时间=每个人的打水时间+等待时间

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 #define MAXNUM 500
 5 
 6 int cmp(const void *a, const void * b)  
 7 {  
 8     return *(int *)a - *(int *)b;  
 9 }
10 int main()  
11 {  
12     int n, r, i, sum=0;
13     int a[MAXNUM],b[MAXNUM];  
14     scanf("%d%d",&n,&r);  
15     for(i=0;i<n;i++)  
16     {
17         scanf("%d",&a[i]);  
18     }
19     qsort(a,n,sizeof(int),cmp);  
20     
21     for(i=0;i<r;i++)  
22     {
23         b[i]=a[i];  
24     }
25     for(i=r;i<n;i++)  
26     {
27         b[i]=b[i-r]+a[i];
28     }
29     
30     for(i=0;i<n;i++)  
31     {
32         sum+=b[i];  
33     }
34     printf("%d\n",sum);
35     return 0;  
36 }  

 

算法二:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 #define MAXNUM 500
 5 
 6 int cmp(const void *a, const void * b)  
 7 {  
 8     return *(int *)a - *(int *)b;  
 9 }
10 int main()  
11 {  
12     int n,r,i,j,minSum;
13     int a[MAXNUM]={0},b[MAXNUM]={0};  
14     scanf("%d%d",&n,&r);  
15     for(i=0;i<n;i++)  
16     {
17         scanf("%d",&a[i]);  
18     }
19     qsort(a,n,sizeof(int),cmp);  
20     
21     j=0;
22     minSum=0;
23     for(i=0;i<n;i++)  
24     {
25         b[j]+=a[i];
26         minSum=minSum+b[j]; 
27         j++;
28         if(j==r) j=0;
29     }
30     printf("%d\n",minSum);
31     return 0;  
32 }  

 

排队打水问题