1420 数袋鼠好有趣(贪心二分)
Posted happy_code
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1420 数袋鼠好有趣(贪心二分)相关的知识,希望对你有一定的参考价值。
有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 }
以上是关于1420 数袋鼠好有趣(贪心二分)的主要内容,如果未能解决你的问题,请参考以下文章