题意:
给定n个冰淇淋球,问能组成最多多少个由k个冰淇淋球堆成的冰淇淋,并且满足下面的冰淇淋球的面积是上面冰淇淋球面积的二倍。
题解:
正解:
对结果进行二分
二分内容:
判定能否堆成m堆,先用b[]的前m个作为每堆的最上面一个a[m],
每堆找k-1个,从剩下的冰淇淋中找第一个>=当前j堆a[j]*2,更新堆底,能堆成返回真否则返回假。
const int maxn=3e5+1000;
int n,k;
ll num_putss;
ll a[maxn];
ll b[maxn];
int biaoji[maxn];
bool cmp(ll x,ll y)
{
return x>y;
}
vector<int>v;
bool check(int mid)
{
for(int i=0; i<mid; i++)
a[i]=b[i];
int number=mid;
for(int i=0; i<k-1; i++)
{
for(int j=0; j<mid; ++j)
{
while(number<n&&b[number]<a[j]*2) number++;
if(number==n) return 0;
a[j]=b[number];
number++;
}
}
return 1;
}
int main()
{
int T,casee=1;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=0; i<n; ++i)
{
scanf("%lld",&b[i]);
}
if(k==1)
{
printf("Case #%d: ",casee++);
cout<<n<<endl;
continue;
}
sort(b,b+n);
int l=0,r=n/k;
while(l<r)
{
int mid=(l+r+1)/2;
if(check(mid))
{
l=mid;
}
else
{
r=mid-1;
}
}
printf("Case #%d: ",casee++);
cout<<l<<endl;
}
return 0;
}