P1873 砍树

伐木工人米尔科需要砍倒M米长的木材。这是一个对米尔科来说很容易的工作,
    因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林。不过,米尔科只被允许
砍倒单行树木。
    米尔科的伐木机工作过程如下:米尔科设置一个高度参数H(米),伐木机升起
 一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部
 分保持不变)。米尔科就行到树木被锯下的部分。
    例如,如果一行树的高度分别为20,15,10和17,米尔科把锯片升到15米的高度,
切割后树木剩下的高度将是15,15,10和15,而米尔科将从第1棵树得到5米,从第
4棵树得到2米,共得到7米木材。
    米尔科非常关注生态保护,所以他不会砍掉过多的木材。这正是他为什么尽可能高
地设定伐木机锯片的原因。帮助米尔科找到伐木机锯片的最大的整数高度H,使得他
能得到木材至少为M米。换句话说,如果再升高1米,则他将得不到M米木材。

输入输出格式

输入格式:
    第1行:2个整数N和M,N表示树木的数量(1<=N<=1000000),M表示需要的木材总长度(1<=M<=2000000000)

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

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

输入输出样例

输入样例#1: 5 20 4 42 40 26 46

输出样例#1: 36



#include<bits/stdc++.h>
using namespace std;
long long a[1000000+10],high=2000000000;//high最高的高度
int m,n;
bool check(int x){
    long long cnt=0;
    for(int i=1;i<=n;++i)
        if(a[i]>x)cnt+=a[i]-x;
        return cnt>=m;
}
int main(){
    int i,mid,low=1,t;//n表示树木的数量,m表示需要的木材总长度
    cin>>n>>m;
    for(i=1;i<=n;++i)
        cin>>a[i];
    while(high>=low)//low<=high
    {
        mid=(high+low)/2;
        if(check(mid)){t=mid;low=mid+1;}
        else high=mid-1;
    }
    cout<<t;
    return 0;
}

原文地址:https://www.cnblogs.com/OMGD/p/10704644.html

时间: 2024-11-05 18:47:36

P1873 砍树的相关文章

洛谷—— P1873 砍树

https://www.luogu.org/problemnew/show/P1873 题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔科设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变).米尔科就行到树木被锯下的部分. 例如,如果一行树的高度分别为20,15,10和17,

codevs 1388 砍树

1388 砍树 http://codevs.cn/problem/1388/ 题目描述 Description 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔科设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变).米尔科就得到树木被锯下的部分. 例如,如果一行树的高度分别为20,15

1369 xth 砍树

1369 xth 砍树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着rabbit 去收集一些木材,给窄森做一个婴儿车……(xth 早就梦想着要天天打菜儿他儿窄森的小 pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪啪……“乌卡卡——”xth 邪恶

xth 砍树(codevs 1369)

题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着rabbit 去收集一些木材,给窄森做一个婴儿车……(xth 早就梦想着要天天打菜儿他儿窄森的小 pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪啪……“乌卡卡——”xth 邪恶滴笑了,“不要告诉 rabbit,她会说我缺德的……”xth 如是说).花园里共有n棵树.为了花园的整体形象,rabb

codevs1369 xth 砍树(线段树)

1369 xth 砍树 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴,小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着rabbit 去收集一些木材,给窄森做一个婴儿车……(xth 早就梦想着要天天打菜儿他儿窄森的小 pp,到时候在婴儿车里安装一个电子遥控手臂,轻轻一按,啪啪啪……“乌卡卡——”xth 邪恶滴笑了

cogs luogu 砍树

★   输入文件:eko.in   输出文件:eko.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] N棵树,每棵都有一个整数高度.有一个木头的总需要量M. 现在确定一个最大的统一的砍树高度H,如果某棵树的高度大于H,则高出的部分被砍下.使得所有被砍下的木材长度之和达到M(允许稍超过M). 例如,有4棵树,高度分别是20 15 10 17, 需要的木材长度为 7,砍树高度为15时,第1棵树被砍下5,第4棵树被砍下2,得到的总长度为7.如果砍树高度为16时,第1棵

{CSDN}{英雄会}{砍树、石子游戏}

砍树 思路: 可以将题目意图转化为:给定一棵树,求其中最接近总权值一半的子树. DFS求每个节点的所有子节点的权值和,遍历每个节点,最接近总权值一半的即为答案.复杂度O(N). 石子游戏: 思路: 一个Nim博弈问题,寻找一个局面的平衡状态,由于是多堆石子,参看Nim博弈的相关理论. {CSDN}{英雄会}{砍树.石子游戏}

HNIEOJ 3964: 砍树

3964: 砍树 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 4[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 给出一个树形图(“tree-shaped” network),有N个顶点.如果删除树上某一个顶点,整棵树就会分割成若干个部分.显然,每个部分内部仍保持连通性. 现在问:删除哪个点,使得分割开的每个连通子图中点的数量不超过N/2?如果有很多这样的点,就按升序输出.     例如,如下图所示的树形图,砍掉顶点3或者顶点8,分割开的各部分满足条件

Leetcode 675.为高尔夫比赛砍树

为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照树的高度从低向高砍掉所有的树,每砍过一颗树,树的高度变为1. 你将从(0,0)点开始工作,你应该返回你砍完所有树需要走的最小步数. 如果你无法砍完所有的树,返回 -1 . 可以保证的是,没有两棵树的高度是相同的,并且至少有一颗树需要你砍. 示例 1: 输入: [ [1,2,3],