目录

问题描述

输入格式

输出格式

样例输入

样例输出

思路一

代码一

思路二

代码二


问题描述

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

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

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


输入格式

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

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


输出格式

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


样例输入

5 20
4 42 40 26 46

样例输出

36

思路一

一道标准的二分答案题,目标是把砍树高度的范围从1~最高的数的高度-1缩小到一个确定的值。那么我们只需要先进行排序,再二分找出能达到砍下M段木材的最大H值,就可以秒了它!!!发起进攻!(NKOJ竟然方法一用时更少,一时无语)

代码一

#include<bits/stdc++.h>
using namespace std;
long long n,m,l=0,maxheight=1,r,mid,a[1000001];//当然也可以用unsigned long
bool checkR(long long pos){long long cnt=0;for(int i=1;i<=n;i++)if(a[i]>pos)cnt+=a[i]-pos;//按pos能砍多少树return cnt>=m;//就是true和false
}
int main(){//二分答案:找到缩小答案范围的方法 scanf("%lld%lld",&n,&m);for(long long i=1;i<=n;i++){scanf("%lld",&a[i]);maxheight=max(maxheight,a[i]);//保存最高的树的高度}maxheight--; //按最高的树的高度砍,什么都砍不到,故-1r=maxheight;while(l<r){//答案范围(相等就确定了) mid=(l+r+1)/2; //要尽量就向高取以免漏过某个高度 (当然,姑且相信砍树高度是整数【虽然事实也是这样】)if(checkR(mid)) //如果mid砍得出来l=mid; //贪心的考虑上面还有没有砍更高的 else //mid砍不出来r=mid-1; //砍得比mid低}printf("%lld",l);//此时l==r,输出谁都一样return 0;
}

思路二

每次按从大到小的树的高度讨论,当出现>需求的时候,把大于的部分按前面以讨论的树的数量取平均值,得到答案

代码二

#include<bits/stdc++.h>
using namespace std;
long long a[1000001],n,m,num,ans,sum;
int main(){scanf("%lld%lld",&n,&m);for(long long i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+n+1);//从小到大排序 num=n;//从n开始讨论 for(;sum<m;num--)//直到砍下的>需求时退出 sum+=(a[num]-a[num-1])*(n-num+1);//每次从大到小按树的高度讨论 //(a[num]-a[num-1]):相较于上一个高度每棵多砍了多少// (n-num+1):有n-(num-1)棵被砍【其实当前讨论的是第num-1棵,因为按第n棵是什么都砍不到的】//此时可以确定,要砍的高度一定在num与num-1之间【因为退出循环前num多减了一次1,但sum却还保持在没有减1的num对应的值】//我们就可以用 第num棵树的高度加上sum比需求多出的数量 除以 n到num的树数 得到结果 ans=a[num]+(sum-m)/(n-num);printf("%lld",ans);return 0;
}

NKOJ1363-砍树相关推荐

  1. 洛谷P1873 砍树

    题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔 ...

  2. 二分答案二题-P1182数列分段II,P1873砍树

    T1:P1182T1:P1182T1:P1182 数列分段SectionIISectionIISection II 评测记录:https://www.luogu.org/recordnew/lists ...

  3. NOIP模拟测试5「星际旅行·砍树·超级树」

    星际旅行 0分 瞬间爆炸. 考试的时候觉得这个题怎么这么难, 打个dp,可以被儿子贡献,可以被父亲贡献,还有自环,叶子节点连边可以贡献,非叶子也可以贡献,自环可以跑一回,自环可以跑两回, 关键是同一子 ...

  4. 建房子 最安全图纸_妄想山海初期该怎么办?砍树狩猎建房子,还能拆别人的房子...

    妄想山海还是一个很有趣的游戏,唯一的缺点就是游戏对手机配置要求比较高,手机太差的玩家,就别想那么多了,希望等游戏正式上线,能优化的好一些吧! 在测试中,玩家能体验到游戏中的各种玩法,也是非常的有趣,而 ...

  5. 二分答案——砍树(洛谷 P1873)

    题目选自洛谷P1873 分析:如果句子非常低,可以收集到的木材会更多,以至于超过需要的数量.随着砍树高度逐渐增大,获得的木材会逐渐减少.砍树高度增加到一定程度时,收集到的木材就会开始不够用.因此需要找 ...

  6. 【洛谷 1873】砍树

    题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔 ...

  7. 洛谷 P1873 砍树 (二分答案)

    P1873 砍树 题意 给定n个树木,指定一个伐木高度h,h高度以上的部分皆可得到,求想要得到总共数量为m的木头,h最高是多少. 1<=N<=1000000,1<=M<=200 ...

  8. 洛谷【P1873】 砍树 简单二分解析

    题目链接:https://www.luogu.com.cn/problem/P1873 题目描述: 伐木工人米尔科需要砍倒 M 米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机 ...

  9. 洛谷题解——P1873:砍树

    视频讲解可以直接点击这个 B 站链接,https://www.bilibili.com/video/BV1jk4y1k7hq/. 题目相关 题目链接 洛谷,https://www.luogu.com. ...

  10. 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树

    题目传送门: 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮 ...

最新文章

  1. 如何布局文章标题才更吸引搜索引擎注意?
  2. 高级经济师计算机水平考试,【2017上海高级经济师评审职称外语、计算机成绩不再为前置条件】- 环球网校...
  3. gradle打包 执行类方法
  4. Android 视频播放器 VideoView 的使用,播放本地视频 和 网络 视频
  5. 第一百二十八期:推荐几个IDEA插件,Java开发者撸码利器,你get到了吗
  6. 展示一个基本的正则用例
  7. 计算机硬软件故障实训报告,计算机维护维修实训报告.docx
  8. 【BZOJ1010】【codevs1319】玩具装箱,斜率优化DP
  9. indexof的使用
  10. Python 爬取 B 站数据分析,宋智孝李光洙谁最受中国粉丝喜爱
  11. Java实现斐波那契数列的两种方法
  12. paip.c++ qt 共享库dll的建立
  13. 树言树语:QQ影音和暴风影音用户体现
  14. 企业入职测试题目及答案_[企业入职性格测试题以及答案信息] 新员工入职性格测试题...
  15. mysql 从库跳过1062_3分钟解决MySQL 1062 主从错误
  16. C# 中国大陆二代身份证号生成及格式验证
  17. 春晚宫女唐奕霖被爆背景深厚 可携助手出入央视排练场享有特权
  18. Luogu 1880 合并石子
  19. 安装VC,NTVDM CPU 遇到无效指令 --绝对能用的解决方法
  20. 数据结构与算法实验: 附加实验 二叉树的建立和输出

热门文章

  1. A_Pancers团队作业4—基于原型的团队项目需求调研与分析
  2. 物联网国赛LORA模块开发基础教程(通用库)—传感器
  3. 快手正在成为下一个拼多多?
  4. 如何根据单号批量查询德邦快递的物流信息
  5. android混淆语法(android代码混淆工具)
  6. android 圆角边框边框渐变,Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout...
  7. 计算机网络基础 之二:物理层
  8. windows软件图标变成白色解决方法
  9. DIY整合自己 IPTV
  10. MySQL运算符ppt_MySQL运算符详解