前言
刚睡醒,迷迷糊糊,所以打算做道水题提提神。
老规矩,还是先放链接:P2676 [USACO07DEC]Bookshelf B
题目意思还是比较简单的,翻译过来就是N头奶牛有a[N]个身高数据,我们要找最少数量的a[i]和,使得和大于书架高度B。讲白了就是贪心+排序的思想。因为想要让最少的a[i]填充B,只能贪最大的身高。
这样的话,问题就转化成依次找最大的身高,这里可以用选择排序,依次找最大直到加和大于书架高度B,也可以一遍遍的做冒泡排序,直到浮到最上层的加和大于B。也可以选择排个序,然后从大到小遍历直到加和大于B。然后打印这些加和项数量。然后就可以AC了。
&esmp;给出我的AC代码:
#include <stdio.h>
#include <stdlib.h>
void Merge(int left,int mid,int right,int a[],int b[]){
int i;
for(i=left;i<=right;i++)
b[i]=a[i];
i=left;
int j=mid+1,k=left;
while(i<=mid&&j<=right){
if(b[i]>b[j]){
a[k]=b[i];
k++;
i++;
}else{
a[k]=b[j];
k++;
j++;
}
}
while(i<=mid){
a[k]=b[i];
i++;
k++;
}
while(j<=right){
a[k]=b[j];
k++;
j++;
}
return;
}
void Mergesort(int left,int right,int a[],int b[]){
if(left>=right)
return;
int mid=(left+right)/2;
Mergesort(left,mid,a,b);
Mergesort(mid+1,right,a,b);
Merge(left,mid,right,a,b);
return;
}
int main(int argc, char *argv[]) {
int i,N,B;
scanf("%d%d",&N,&B);
int a[N],b[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
Mergesort(0,N-1,a,b);
int sum=0;
for(i=0;i<N;i++){
sum+=a[i];
if(sum>=B)
break;
}
i++;
printf("%d",i);
return 0;
}