洛谷 P1873 【砍树】

一个long long 引发的惨案

因为数据范围过大,所以要用long long !!!

吐槽结束



一看题目的数据范围就知道只能用二分答案(话说题解区第一篇真。。。洛谷评测机太好了)

二分枚举高度,然后一个一个带进去算能看多少树,注意:累加木材的变量要开long long,不然。。。不然会爆
(最终得40,然后#2数据下载下来你会发现自己都无法手测,反正我是贴不进exe)

#include<iostream>
#include<algorithm>
using namespace std;
long long n,m;
long long a[1000007];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];//读入
	long long l=0,r=2e9+1,mid;
	while(l+1<r)//模板
	{
		mid=(l+r)/2;
		long long sum=0;//累加木材数
        	//本来只有这个要开long long,但是一气之下就全都写了long long
		for(int i=1;i<=n;i++)
		if(a[i]-mid>=0)sum+=(a[i]-mid);
        	//枚举每一棵树,注意:树木高度高于定好的高度才能砍
            	//所以先要判断是不是高,不能直接累加(不然就有木材是负的)
		if(sum>=m)l=mid;//能砍到的木材太多了,说明高度太低
		else r=mid;//木材太少了,高度要高一点
	}
	cout<<l<<endl;//l为答案
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值