版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82952039
链接:
https://odzkskevi.qnssl.com/e4ddab4bbddb4d48602cd7ef31d6c6fa?v=1538214057
题意:
给n个冰淇淋球,告诉每个冰淇淋球的体积,可以将若干个冰淇淋球堆成一个塔,需要满足的条件是当前冰淇淋球的体积至少是在它上面的那个球的体积的两倍,一个塔至少有k层,即一个塔至少由k个冰淇淋组成,问最多可以堆成多少个塔。
思路:
二分答案,检验是否可行。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5+10;
ll a[maxn],b[maxn];
int t,T,n,k;
int judge(int m)
{
for(int i=0;i<m;i++)
{
a[i]=b[i];
}
int p=m;
for(int i=m;i<m*k;i++)
{
while(b[p]<a[i-m]*2&&p<n) p++;
if(p==n)return 0;
a[i]=b[p];
p++;
}
return 1;
}
int binsearch(int l,int r)
{
while(l<r)
{
int mid =(l+r+1)/2;
if(judge(mid)) l=mid;
else r=mid-1;
}
return l;
}
int main()
{
int cnt=1;
for(cin>>T;T--;)
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>b[i];
}
sort(b,b+n);
printf("Case #%d: %d\n",cnt++,binsearch(0,n/k));
}
return 0;
}