1420 数袋鼠好有趣(贪心二分)

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

有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


//这题不难,一只袋鼠只能被套或者套,想清楚即可,必定是选择最小的那一群袋鼠被套,所以二分验证即可
虽然是981ms,加读入挂就可以到151ms
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define INF 0x3f3f3f3f
 4 #define LL long long
 5 #define MX 500005
 6 
 7 int n;
 8 int dat[MX];
 9 int check(int x)
10 {
11     int s=1, pos = x+1;
12     while (s<=x)
13     {
14         while (pos<=n&&dat[pos]<dat[s]*2) pos++;
15         if (pos<=n)
16         {
17             s++;
18             pos++;
19         }
20         else return 0;
21     }
22     return 1;
23 }
24 
25 bool cmp(int a,int b){
26     return a<b;
27 }
28 
29 int main()
30 {
31     scanf("%d",&n);
32 
33     for (int i=1;i<=n;i++)
34         scanf("%d",&dat[i]);
35     sort(dat+1,dat+n+1,cmp);
36 
37     int l=0, r=n/2, ans;
38     while (l<=r)
39     {
40         int mid = (l+r)>>1;
41         if (check(mid))
42         {
43             l = mid+1;
44             ans = mid;
45         }
46         else r = mid-1;
47     }
48     printf("%d\n",n-ans);
49 }
View Code

 



posted @ 2017-10-03 12:15  happy_codes  阅读(414)  评论(0编辑  收藏  举报