【题目描述】
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
所有N(1 <= N <= 20,000)头奶牛都有一个确定的身高H_i(1 <= H_i <= 10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1 <= B <= S < 2,000,000,007。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。
【输入格式】
- 第1行: 2个用空格隔开的整数:N 和 B
- 第2..N+1行: 第i+1行是1个整数:H_i
【输出格式】
- 第1行: 输出1个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部
【输入输出样例】
【输入】
6 40 6 18 11 13 19 11
【输出】
3
自己的AC代码:
#include <iostream>
using namespace std;
int H_i[100000];
int main()
{
int i,j,N,S,B,temp,m,ans=0,sum=0;
scanf("%d %d",&N,&B); //输入N和B;
for(i=1;i<=N;++i)
{
scanf("%d",&H_i[i]);
} //输入高度H_i;
for(i=1;i<=N;++i)
{
for(j=i+1;j<=N;++j)
{
if(H_i[i]<H_i[j])
{
temp=H_i[i];
H_i[i]=H_i[j];
H_i[j]=temp;
}
}
} //冒泡排序,从大到小;
for(i=1;i<=N;) //若括号内有++i,循环的次数就已经确定
{
ans=ans+H_i[i];
sum++;
if(ans>=B)
{
printf("%d",sum);
break;
}
else i++; //如果没满足条件就需要进入到下一个循环
} //统计最少需要多少只牛
return 0;
}
测试结果: