题目名字
E - EKO / 砍树
[题目链接]:https://www.luogu.com.cn/problem/P1873
题意
Mirko 设置一个高度参数 m(米),伐木机升起一个巨大的锯片到高度 m,并锯掉所有树比 m 高的部分(当然,树木不高于 m 米的部分保持不变)Mirko 得到树的总和长度H。
思路
- 找到它的中间值,用它的中间值不停的去寻找它合适的高度。
坑点
- 第一时间会想到用for循环导致运行时间超时。
- 或者用暴力计算,也会导致时间超时,增加运算量和代码的复杂度。
算法一:c++
时间复杂度
普及/提高−
实现步骤
- 找到中间值.
- 用二分不停的去寻找它的适合高度.
- 再输出这个高度。
代码
#include<stdio.h>
long long int n,m,high[1e6+10];
long long int tmp,left,right;
int main()
{
scanf("%lld%lld",&n,&m);//注意读入输出要使用lld
for(long long int i=1;i<=n;i++){
scanf("%lld",&high[i]);
if(high[i]>right){
right=high[i];//找到最大的high[i]做为right
}
}
while(left<=right){
int mid=(left+right)/2;
tmp=0;
for(int i=1;i<=n;i++){
if(high[i]>mid){
tmp+=high[i]-mid;//树的总和够不够数?
}
}
if(tmp<m) right=mid-1;//总和是否够了。
else left=mid+1;
}
printf("%lld",right);//输出最终结果
return 0;//不加return 0 结果return WA;
}
总结
利用好二分的简单寻找能力,还有运行时长短的这个特长。