我爱蜜袋鼯 (二分查找再进行贪心判断)



题目描述

你知道蜜袋鼯吗?
蜜袋鼯是一种有袋动物(有袋的温血动物像袋鼠和沙袋鼠),蜜袋鼯产于澳洲纽几内亚和南澳洲,大多数时间在树上活动,舔食树蜜。蜜袋鼯的身体两侧拥有滑行膜, 从手关节延伸到脚踝,有利它们在树林间滑行。现在被作为宠物饲养,因为它们外形可爱、较为粘人、可随身携带,被称为“小蜜”,风靡全球。别名:小飞鼠。


雌性蜜袋鼯的肚脐位置上长有一个育婴袋,幼兽都是以早产儿的状态出生,初生幼体会自行爬入袋囊中,然后囊内哺乳而逐渐成长。
雌性的怀孕期只有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;
}





你可能感兴趣的:(我爱蜜袋鼯 (二分查找再进行贪心判断))