题目描述
你知道蜜袋鼯吗?
蜜袋鼯是一种有袋动物(有袋的温血动物像袋鼠和沙袋鼠),蜜袋鼯产于澳洲纽几内亚和南澳洲,大多数时间在树上活动,舔食树蜜。蜜袋鼯的身体两侧拥有滑行膜, 从手关节延伸到脚踝,有利它们在树林间滑行。现在被作为宠物饲养,因为它们外形可爱、较为粘人、可随身携带,被称为“小蜜”,风靡全球。别名:小飞鼠。
雌性蜜袋鼯的肚脐位置上长有一个育婴袋,幼兽都是以早产儿的状态出生,初生幼体会自行爬入袋囊中,然后囊内哺乳而逐渐成长。
雌性的怀孕期只有16天,每次可产下四只幼崽,不过一般都是一到两只。它们会爬进母亲的育儿袋,在里面住上大约70天时间,直至完全发育。
—————摘自百度百科《蜜袋鼯》
李华,李雷和韩梅梅夫妇的儿子,是个天真可爱的小正太,他花了几千元购买了一对小蜜。这不,小蜜夫妇产仔了,宝宝待在妈妈的育婴袋里十分可爱。李华还邀请了班上的青梅竹马,刘芳来家里看小蜜夫妇和他们的宝宝。
刘芳,女,10岁,天真烂漫,陶醉地看着小蜜夫妇半天后,她突然想到了一个非常问题,她娇声地问李华:
有n只蜜袋鼯,每只蜜袋鼯有自己的体型,每只蜜袋鼯的育婴袋可以最多装下一只体型小于它一半的蜜袋鼯。如果一只蜜袋鼯A被装在另一只蜜袋鼯B的育婴袋中,那么A的育婴袋中不能装入别的蜜袋鼯。
被装在育婴袋的蜜袋鼯,是不容易被看见的,所以看上去只有母体一只蜜袋鼯。
现在,该如何安排装袋,来使得蜜袋鼯的个数看上去最少。
输入格式
多组输入数据
第一行为一个整数n(1<=n<=100000),第二行为n个整数size1,size2,...,sizen,表示n只蜜袋鼯的体型。
如果第i只蜜袋鼯的育婴袋可以装下第j只蜜袋鼯,则不等式sizei>=2*sizej成立。
输出
对于每组输入数据,输出最少可以看见的蜜袋鼯的数量。
样例输入
8
2 5 7 6 9 8 4 2
8
9 1 6 2 6 5 8 3
3
1 2 3
样例输出
5
5
2
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<math.h>
#include<stack>
using namespace std;
#define LL long long
#define mp(a,b) make_pair((a),(b))
#define clr(x,a) memset(x,a,sizeof(x))
#define INF 0x3f3f3f3f
#define lb(x) ((x)&(-x))
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1005,siz=1e9;
const int MOD=1e9+7;
int n;
int gcd(int x,int y){
return y==0?x:gcd(y,x%y);
}
int a[100100];
bool ok(int m){
for(int i=0;i<m;i++)
if(a[i]*2>a[n-m+i]) return false;
return true;
}
int main()
{
// freopen("aaa.txt","r",stdin);
//freopen("bbb.txt","w",stdout);
while(~scanf("%d",&n)){
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=n/2;
int ret=0;
while(l<=r){
int m=(l+r)>>1;
if(ok(m)){
ret=m;
l=m+1;
}else r=m-1;
}
cout<<n-ret<<endl;
}
return 0;
}