• NKOI 1363 (基础二分)


    【COCI 2011/2012 CONTEST #5-2】砍树

    Time Limit:10000MS  Memory Limit:32000K
    Total Submit:49 Accepted:26 
    Case Time Limit:1000MS

    Description

    N棵树,每棵都有一个整数高度。有一个木头的总需要量M。 

    现在确定一个最大的统一的砍树高度H,如果某棵树的高度大于H,则高出的部分被砍下。使得所有被砍下的木材长度之和达到M(允许稍超过M)。 


    例如,有4棵树,高度分别是20 15 10 17, 需要的木材长度为 7,砍树高度为15时,第1棵树被砍下5,第4棵树被砍下2,得到的总长度为7。如果砍树高度为16时,第1棵树被砍下4,第4棵树被砍下1,则得到的木材数量为5。 


    Input

    第1行:2个整数N和M,N表示树木的数量(1 ≤ N ≤ 1 000 000),M表示需要的木材总长度(1 ≤ M ≤ 2 000 000 000)。 


    第2行: N个整数表示每棵树的高度,值均不超过1 000 000 000。所有木材高度之和大于M,因此必然有解。 

    Output

    第1行:1个整数,表示砍树的最高高度。 

    Sample Input

    5 20
    4 42 40 26 46
    
    

    Sample Output

    36
    

    Source

    Croatian Open Competition in Informatics 2011/2012

    解题思路:

      这道题目就是直接把最低的树和最高的树选出来,然后构成一个[l,r]的区间,在这个区间上进行二分,

    找到一个h,使得a[i]>=k,且满足sum>=m的最大的h,既然要求最大的,那么我们最后输出r就

    可以了。

    代码:

     1  # include<cstdio>
     2     # include<iostream>
     3     # include<algorithm>
     4 
     5     using namespace std;
     6 
     7     # define MAX 1000000+4
     8 
     9     int a[MAX];
    10     int n,m;
    11     int l,r;
    12     int check ( int h )
    13     {
    14          int sum = 0;
    15          for ( int i = 0;i < n;i++ )
    16          {
    17              if ( a[i] > h )
    18              {
    19                  sum+=(a[i]-h);
    20              }
    21              if ( sum >= m )
    22              {
    23                  return 1;
    24              }
    25          }
    26          return 0;
    27     }
    28 
    29     int main(void)
    30     {
    31         scanf("%d%d",&n,&m);
    32         for ( int i = 0;i < n;i++ )
    33         {
    34             scanf("%d",&a[i]);
    35             l = min(l,a[i]);
    36             r = max(r,a[i]);
    37         }
    38         while ( l <= r )
    39         {
    40             int mid = (l+r)>>1;
    41             if ( check(mid) )
    42             {
    43                 l = mid+1;
    44             }
    45             else
    46             {
    47                 r = mid-1;
    48             }
    49         }
    50        printf("%d
    ",r);
    51         return 0;
    52     }
    View Code
  • 相关阅读:
    MacOS Catalina 10.15安装教程,启动U盘制作及安装方法
    苹果macOS Catalina 10.15 正式版推送了,要不要升级,需要注意什么?
    Sublime Text Mac如何进行按键绑定?
    Mac软件应用程序打开出现意外退出、崩溃解决办法
    使用VScode Mac版编译配置C/C++程序完整图文教程
    pycharm pro 2019 mac重构技巧?
    一体化数据库管理Navicat Premium for Mac的命令提示代码
    jsonp理解
    linux系统命令大全
    java学习笔记之分层增删改查
  • 原文地址:https://www.cnblogs.com/wikioibai/p/4391146.html
Copyright © 2020-2023  润新知