二分答案加双指针扫描 gym101194D

xiaoxiao2021-02-28  106

#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; }
转载请注明原文地址: https://www.6miu.com/read-65021.html

最新回复(0)