HDU 4004 The Frog's Games



http://acm.hdu.edu.cn/showproblem.php?pid=4004

之前做了个题也是这个情景 但是一直没过竟然把我气哭了 心理承受能力 还真是不太好。

题意:青蛙过河 求它能跳的最远距离最小是多少。

思路:最小化最大值问题,二分+贪心。策略是每回逼不得已才跳一次,二分答案验证。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;

int a[500010],L,N,M;
bool check(int mid){
    int last = 0, cnt = 1;
    for(int i=1; i<=N; i++){
        if((a[i] - a[last] <= mid) && (a[i + 1] - a[last] > mid)){
            last = i;
            cnt++;
        }
        else if(a[i] - a[last] > mid)
                return false;
    }
    if(cnt <= M && a[N+1] - a[last] <= mid) return true;
    return false;
}

int main(){
//    freopen("in.txt", "r", stdin);
    while(scanf("%d%d%d",&L,&N,&M) == 3){
        for(int i=1; i<=N; i++){
            scanf("%d",&a[i]);
        }
        a[0] = 0, a[N+1] = L;
        sort(a, a+N+1);
        int l = 1, r = L, ans = 0;
        while(l <= r){
            int mid = (l + r) >> 1;
            if(check(mid)){
                r = mid - 1;
                ans = mid;
            }
            else
                l = mid + 1;
        }
        printf("%d\n",ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值