P1873 砍树
题意
砍 M 米长的木材,只被允许砍伐一排树。设置一个高度参数 H(米),伐木机升起一个巨大的锯片到高度 H,并锯掉所有树比 H 高的部分(当然,树木不高于 H 米的部分保持不变)。得到树木被锯下的部分。
思路
- 利用二分法找出中间值,根据中间值找出锯片的最高高度
坑点
- 不用二分法会超时
算法一:XX+XX
时间复杂度
$
实现步骤
- 先定义长整型
- 利用二分模版
代码
long long int n,m,high[1000000+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;
//printf("%d ",mid);
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;
}
总结
利用二分法解决问题,并要正确理解题意。