排队打水问题
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 }