Codeforces 373C:Counting Kangaroos is Fun(二分+贪心)

来源:互联网 发布:淘宝店刷钻是真的吗 编辑:程序博客网 时间:2024/05/18 13:07
C. Counting Kangaroos is Fun
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

There are n kangaroos with pockets. Each kangaroo has a size (integer number). A kangaroo can go into another kangaroo's pocket if and only if the size of kangaroo who hold the kangaroo is at least twice as large as the size of kangaroo who is held.

Each kangaroo can hold at most one kangaroo, and the kangaroo who is held by another kangaroo cannot hold any kangaroos.

The kangaroo who is held by another kangaroo cannot be visible from outside. Please, find a plan of holding kangaroos with the minimal number of kangaroos who is visible.

Input

The first line contains a single integer — n (1 ≤ n ≤ 5·105). Each of the next n lines contains an integer si — the size of the i-th kangaroo (1 ≤ si ≤ 105).

Output

Output a single integer — the optimal number of visible kangaroos.

Examples
input
825769842
output
5
input
891626583
output
5
题目大意:有一群袋鼠,一个袋鼠能被装进另一个袋鼠的袋子里(大袋鼠的体积是小袋鼠的二倍或二倍以上),装进后就看不到袋子里的袋鼠了,问这群袋鼠如何行动才能使得它们看着数量最少,请输出该数量。(注意,一个大袋鼠装个小袋鼠,则小袋鼠里面不能再嵌套袋鼠了)。
解题思路:二分法,先将袋鼠按体积从小到大排序,如果想让数量看起来是mid个,那么前n-mid个袋鼠要被装进去,举个例子:1   2   3    4    5  6   7 想让外面留5个
那么前两个被装,第一个装进第六个里面,第二个装进第七个里面 。
代码如下:
#include <cstdio>#include <algorithm>using namespace std;int a[500010];int n;bool judge(int x){if(x<(n+1)/2)//(n+1)/2是最少的方案,如果比最少的还少,说明这个区间该舍弃了 {return false;}for(int i=0;i<n-x;i++){if(a[i+x]/a[i]<2)//第i个装进第i+x个 ,有其中一个不满足2倍条件的话,就返回false return false;}return true;//都符合的话,返回true }int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}sort(a,a+n);int l=1,r=n;int mid,ans;while(l<=r){mid=(l+r)/2;if(judge(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}printf("%d\n",ans);return 0;}


0 0