首页 > 其他 > 详细

【NOIP2015提高组】跳石头

时间:2017-09-16 16:50:16      阅读:263      评论:0      收藏:0      [点我收藏+]

https://www.luogu.org/problem/show?pid=2678

最小值最大问题,二分答案。每次检查是否能仅移走m块岩石使得所有跳跃距离均大于等于mid。

#include <iostream>
#include <list>
#define maxn 50005
const int inf = 0x7fffffff;
using namespace std;
int l, n, m;
int dist[maxn];
bool check(int k);
int main()
{
    cin >> l >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> dist[i];
    dist[++n] = l;

    int left = 0, right = 1000000005, mid;
    while (left < right)
    {
        mid = (left + right + 1) / 2;
        if (check(mid)) // 能否仅通过移去m块石头使所有跳跃距离≥mid
            left = mid;
        else
            right = mid - 1;
    }
    cout << left << endl;
    return 0;
}
bool check(int k)
{
    int cnt = 0;
    int last = 0;
    for (int i = 1; i <= n; i++)
    {
        if (dist[i] - dist[last] < k)
            cnt++;
        else
            last = i;
        if (cnt > m)
            return false;
    }
    return true;
}

 

【NOIP2015提高组】跳石头

原文:http://www.cnblogs.com/ssttkkl/p/7531672.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!