
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5+5;
long long a[MAXN],b[MAXN];
bool Judge(int x,int N,int K){
for(int i=0 ; i<x ; ++i)b[i] = a[i];
int j = x;
for(int i=x ; i<x*K ; ++i){
while(a[j]<b[i-x]*2 && j<N)++j;
if(j >= N)return false;
b[i] = a[j++];
}
return true;
}
int main(){
int T,N,K;
scanf("%d",&T);
for(int _=1 ; _<=T ; ++_){
scanf("%d %d",&N,&K);
for(int i=0 ; i<N ; ++i)scanf("%lld",&a[i]);
sort(a,a+N);
int l=0,r=N/K;
while(l < r){
int m = (l+r+1)/2;
if(Judge(m,N,K))l = m;
else r = m-1;
}
printf("Case #%d: %d\n",_,l);
}
return 0;
}
本文分享了一道C++算法竞赛题目,通过使用排序和二分查找技巧来解决一个复杂的问题。代码中详细展示了如何判断在给定条件下,是否能够找到特定数量的元素满足条件,最终找出满足条件的最大元素数量。
&spm=1001.2101.3001.5002&articleId=83240818&d=1&t=3&u=3a8f03ceb9724f4092ef7c3a67033135)
211

被折叠的 条评论
为什么被折叠?



