您的位置:首页 > 其它

数袋鼠好有趣

2017-06-23 08:34 211 查看
有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 <algorithm>
#include <cstdio>

using namespace std;

const int MAXN = 5e5;

int input[MAXN];

int search(int left, int right, int k)
{
int result = -1;
while (left < right-1)
{
int mid = left + (right-left)/2;
if (input[mid] >= k)
{
right = mid;
}
else
{
left = mid;
}
}

if (input[left] >= k)
{
result = left;
}
else if (input[right] >= k)
{
result = right;
}

return result;
}

int main(int argc, const char * argv[])
{
int n;
cin >> n;

for (int i = 0; i < n; i++)
{
cin >> input[i];
}

sort(input, input + n);

int right = search(0, n, 2 * input[0]);
if (right == -1)
{
cout << n << endl;
return 0;
}

int count = 0;

for (int i = 0; i < n / 2; i++)
{
while (right < n)
{
if (input[right] >= 2*input[i])
{
break;
}
right++;
}

if (right < n)
{
count++;
right++;
}
else
{
break;
}
}

cout << n - count << '\n';
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: