怪就怪自己想多了,不敢写,自己担心的情况根本不可能出现。
sort排序后开始从大到小遍历,可以满足要求,所用数组元素标记为不能用;ans++;
我所担心的是如果标记之后没有达到ans++的要求,之后还需要这些元素怎么办,后来发现这种情况不存在,因为如果标记之后没有达到ans++的要求,那么后边比它小的数字更不可能达到要求。
#include<cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
const int MAX=1e6+1;
long long int a[MAX];
int b[MAX];
int main()
{
int i,n,m,j,k,l,T,t,z,q;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
q=0;
scanf("%d%d",&T,&t);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(j=0; j<=T-1; j++)
{
scanf("%lld",&a[j]);
}
sort(a,a+T);
for(j=T-1; j>=0; j--)
{
l=j;
z=0;
if(b[j]==0)
{
z++;
b[j]=1;
for(k=j-1; k>=0; k--)
{
if(a[l]>=2*a[k]&&b[k]==0)
{
l=k;
b[k]=1;
z++;
if(z==t)
{q++;break;}
}
}
}
}
printf("Case #%d: %d\n",i,q);
}
}