EKO/砍树
题目链接
https://www.luogu.com.cn/problem/P1873
题意
将所有高度为 M 的木头均砍为长度为 k 的木段
思路
- 定义和输入所需值
- 确定走右边界值
- 主函数用来输出 l 的值
算法一:二分
实现步骤
- 定义和输出所需值
- 是用二分法确定左右边界值
- 输出结果,即 l 的值
代码
// https://vjudge.net/contest/595345#problem/E
#include<cstdio>
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)>>1;
//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;
}
总结
需掌握二分法来进行做题