C++ 关于二分最干的干货 附P2678 [NOIP 2015 提高组] 跳石头 二分解决
#include
using namespace std;
int L,N,m;
const int n=5e4+9;
int a[n];
int check(int mid)
{
int res=0;
int lst=0;
for(int i=1;i<=N;i++)
{
if(a[i]-a[lst]>L>>N>>m;
for(int i=1;i<=N;i++)
{
cin>>a[i];
}
long long l=0;
long long r=1e9+5;
while(l+1!=r)
{
long long mid=(l+r)/2;
if(check(mid)<=m)l=mid;
else r=mid;
}
cout<
记住模板,猛抓二分思维解决最最值问题(没打错)
首先找出单调关系(可以相等)
比如拿的石头愈多,距离越长;又因为最多拿到石头数量知道,所以可以枚举距离,看这个距离所需拿的最少数量,直至超过,那么上一个便为答案。
写模板
long long l=0;
long long r=1e9+5;
while(l+1!=r)
{
long long mid=(l+r)/2;
if(check(mid)<=m)l=mid;
else r=mid;
}
cout<
注意if里的《=号里的=号,让l取到最小的最大值;
以上为我的理解,能帮到你很开心,也欢迎补充与指正。











