1 #include<stdio.h> 2 #include<stdlib.h> 3 int cmp(const void *a,const void *b) 4 { 5 return *(int *)b-*(int *)a;//降序 6 } 7 int main() 8 { 9 int i,s,w,n,num,max,min; 10 int a[400]; 11 scanf("%d",&s); 12 while(s--) 13 { 14 num=0; 15 scanf("%d%d",&w,&n); 16 for(i=0;i<n;i++) 17 scanf("%d",a+i); 18 qsort(a,n,sizeof(a[0]),cmp); 19 max=0;min=n-1;//从大到小排过序后,让max 和min分别指向开头和结尾的下标,双向同时进行;(以max) 为主,不断地向后移;min向前移; 20 while(max<=min) 21 { 22 if(a[max]==w) {max++;num++;}//如果前面的元素等于船的容量,则所需船数加1 23 else if(a[max]+a[min]<=w)//如果前面的元素小于船的容量,就看后面的元素有没有和该元素相加后小于等于船的容量的,若有则船数加1,同时下标一个加1,一个减1; 24 { 25 max++;min--;num++; 26 } 27 else {max++;num++;}//如果没有和前面元素相匹的元素,则船数加1,同时max加1,看下一个元素; 28 } 29 printf("%d\n",num); 30 } 31 system("pause"); 32 return 0; 33 } 34
相关文章: