有n只袋鼠。每只袋鼠的大小用一个整数表示。一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍。
每只大袋鼠最多可以装一只袋鼠。小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了。
小袋鼠被装进大袋鼠之后就不能被我们看见了。请找出一个装袋鼠的方案,使得被看见的袋鼠最少。
Input
单组测试数据。 第一行包含一个整数n(1≤n≤5*10^5)。 接下来n行,每行一个整数si,表示第i只袋鼠的大小 (1≤si≤10^5)。
Output
输出一个整数,即最少能看见的袋鼠数量。
Input示例
8 2 5 7 6 9 8 4 2
Output示例
5
题意:有一群袋鼠 只要大袋鼠的大小是小袋鼠的两倍或以上 就可以装下这只袋鼠(开始的时候以为是像套娃一样可以继续装 越做越不对)
思路:每只袋鼠只有一次装或者被装的机会 所以用两个下标记录最大位置的和一半位置的 不断缩小即可
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#define max_ 500100
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int n;
int num[max_];
bool vis[max_];
int main(int argc, char const *argv[])
{
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
sort(num+1,num+1+n);
int l=n>>1,r=n;
int cnt=0;
while(l>0)
{
if(num[r]>=num[l]*2)
{
r--;
l--;
cnt++;
}
else
l--;
}
printf("%d\n",n-cnt);
}
return 0;
}