zoukankan      html  css  js  c++  java
  • 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-ans);
    49 }
    View Code


  • 相关阅读:
    zabbix server监控本机agent
    虚拟机添加配置双网卡linux
    linux改变默认运行级别
    linux重置root密码
    vi文本编辑器
    centos7 mysql安装和基本操作yum安装
    安装wordpress个人网站
    httpd安装与配置(centos7) 2
    httpd安装与配置(centos7)
    Mac升级Python3
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/7623565.html
Copyright © 2011-2022 走看看