数袋鼠好有趣

来源:互联网 发布:八百字淘宝导购 编辑:程序博客网 时间:2024/05/01 11:41

n只袋鼠。每只袋鼠的大小用一个整数表示。一只小袋鼠能装进一只大袋鼠的条件是,大袋鼠的大小至少是小袋鼠的两倍。

每只大袋鼠最多可以装一只袋鼠。小袋鼠被装进大袋鼠之后就不能再装其它的袋鼠了。

小袋鼠被装进大袋鼠之后就不能被我们看见了。请找出一个装袋鼠的方案,使得被看见的袋鼠最少。


Input
单组测试数据。第一行包含一个整数n(1≤n≤5*10^5)。接下来n行,每行一个整数si,表示第i只袋鼠的大小 (1≤si≤10^5)。
Output
输出一个整数,即最少能看见的袋鼠数量。
Input示例
825769842
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;}


原创粉丝点击