这道题就是每次拿出k个,要求下面>=2*上面的。问最多找几摞。
方法:贪心+二分。二分枚举答案。每一次都是看是否合法。
从小到大排序,每次顶端放的都是最小的。
代码:
#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
#define inf 1e9
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
int a[300010],b[300010];
int n,k;
bool check(int x)
{
int i,j,tot;
for(i=1;i<=x;i++)
{
b[i]=a[i];
}
for(i=2,tot=x+1;i<=k;i++)
{
for(j=1;j<=x;j++)
{
while(tot<=n)
{
if(b[j]*2<=a[tot])
{
b[j]=a[tot];
tot++;
break;
}
tot++;
}
if(tot>n)
{
return 0;
}
}
}
return 1;
}
int bSearch(int bi, int ed)
{
int mid, left = bi, right = ed;
while(left <= right)
{
mid = (left + right) >> 1;
if(!check(left)) right = mid - 1;
else left = mid + 1;
}
return left;
}
int main()
{
ios::sync_with_stdio(false);
int t,cas=1;
cin>>t;
while(t--)
{
int i,ans;
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
cout<<"Case #"<<cas++<<": "<<bSearch(1,n/k)<<endl;
}
}