二分答案加双指针扫描 gym101194D

来源:互联网 发布:为什么讨厌中国人 知乎 编辑:程序博客网 时间:2024/06/05 19:08
#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;}