P2672跳石头

Posted china-mjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2672跳石头相关的知识,希望对你有一定的参考价值。

这是2015noip的一道二分答案的题目,看了题解才会,,

题目给出石头的位置并且让你踩着石头往前跳,最多删掉m个石头还可以顺利通过,求解最短跳跃距离的最大值。

那么二分什么呢:mid为跳跃的长度。那么left=0,right=l进行二分.再拿s和now分别记录当前搬走的石头数量,判断是否可以跳过去(用类似前缀和的思想)。最后当前跳跃使得搬走的石头>=m,那么则让right=mid-1,如果搬走的<=m,那么就记录下当前的mid,left=mid+1。又因为题目说的是最小距离的最大值,那么最后找到的则是最大的。

1.明确什么题目可以用二分 eg.最大的最小,k优,关键量具有单调性,最小平均路。。

2.二分什么求解什么

3.怎么来改变二分的左右端点

4.仔细读题,看好至多至少等关键字,把逻辑搞清楚

#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define maxn 600000
using namespace std;
int m,n;
int l,d;
int left,right,mid;
int a[maxn];
int s,now;
int ans=0;
int main()
    cin>>l>>n>>m;    
    for(int i=1;i<=n;i++)
        cin>>a[i];
    
    int left=0,right=l;
    while(left<=right)//二分跳跃长度 
        mid=(left+right)/2;
        now=0;//跳到第几个 
        s=0;//搬了几个石头 
        for(int i=1;i<=n;i++)
            if(a[i]-a[now]<mid)//假如跳过去了 
            s++; //搬走 
            
            else
                now=i;
             
        
        if(s<=m)
            ans=mid;
            left=mid+1;
        
        else right=mid-1; 
    
    cout<<ans;
    return 0;

 

以上是关于P2672跳石头的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2015提高组]跳石头

4768 跳石头

4768 跳石头

跳石头

4768 跳石头

4768 跳石头