#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 300005;
ll a[maxn],b[maxn];
int t,T,n,k;
bool judge(int x) //第一层总是优先选取较小的为最优策略
{
for(int i = 0 ;i< x;i++)
a[i] = b[i];
int p = x;
for(int i =x ;i< x*k;i++)
{
while(b[p]<a[i-x]*2 && p<n) p++;
if(p==n)
return 0;
a[i]=b[p];
p++;
}
return 1;
}
int bitsection(int l,int r)
{
while(l<r)
{
int mid = (l+r+1)>>1;
if(judge(mid))
l=mid;
else r=mid-1;
}
return l;
}
int main()
{
cin>>T;
for(t=1;t<=T;t++)
{
cin>>n>>k;
for(int i = 0; i < n; i++)
cin>>b[i];
sort(b,b+n);
ll ans =bitsection(0,n/k); //满足二分性质
printf("Case #%d: %lld\n",t,ans);
}
return 0;
}
二分答案加双指针扫描 gym101194D
最新推荐文章于 2022-09-21 16:35:48 发布