跳石头

来源:互联网 发布:stm32串口提取数据 编辑:程序博客网 时间:2024/03/29 03:07

还是看了答案。。。自己就是调不对

描述

每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 <Di <L)。

在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。

农夫约翰为他的奶牛们感到自豪并且年年都观看了这项比赛。但随着时间的推移,看着其他农夫的胆小奶牛们在相距很近的岩石之间缓慢前行,他感到非常厌烦。他计划移走一些岩石,使得从起点到终点的过程中,最短的跳跃距离最长。他可以移走除起点和终点外的至多M(0 ≤ MN) 个岩石。

请帮助约翰确定移走这些岩石后,最长可能的最短跳跃距离是多少?

二分啊 注意答案是什么 mid?l?r?可以三个都判断一下,C(l),C(mid),C(r)按照贪心的顺序
代码
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <cstdio>
#include <string>
#include <vector>
#include <math.h>
#include <time.h>
#include <utility>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,L;
int a[1000010];
bool C(int val)
{
    int last=0;
    int temp=0;
    for(int i=1;i<=n+1;i++)
    {
        if(a[i]-last<val)
        {
            temp++;
        } else last=a[i];
    }
    if(temp<=m)return 1;
    else return 0;
}
int main()
{
    cin>>L>>n>>m;
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    int l=-1;
    int r=L;
    int mid;
    a[n+1]=1e9+1;
    while(r-l>1)
    {
        mid=(l+r)/2;
        if(C(mid))l=mid;
        else r=mid;
    }
    if(C(r))cout<<r<<endl;
    else if(C(mid))cout<<mid<<endl;
    else cout<<l<<endl;
    return 0;
}

0 0