Resolución de preguntas: saltar piedras (dos puntos)

Enlace: https://ac.nowcoder.com/acm/contest/22353/C
Fuente: Niuke.com

题目描述 
一年一度的“跳石头”比赛又要开始了!
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终	
点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳
向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,
组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。
输入描述:
输入文件第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多
移走的岩石数。
接下来 N 行,每行一个整数,第 i 行的整数 Di(0 < Di < L)表示第 i块岩石与起点的距离。这些岩石按与起点距离从	
小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出描述:
输出文件只包含一个整数,即最短跳跃距离的最大值。
示例1
输入
25 5 2
2
11
14
17
21
输出
4
说明
将与起点距离为 2 和14 的两个岩石移走后,最短的跳跃距离为 4(从与起点距离17的岩石跳到距离 21的岩石,或者
从距离 21 的岩石跳到终点)。
备注:
对于20%的数据,0 ≤ M ≤ N ≤ 10。
对于50%的数据,0 ≤  M ≤ N ≤ 100。
对于100%的数据,0 ≤ M ≤ N ≤ 50,000,1 ≤ L ≤ 1,000,000,000。

Idea: bisección, distancia de bisección, la condición de bisección es el número de piedras cuya distancia real es menor que la distancia actual de dos centavos. Cuando excede m, significa que la distancia actual de dos secciones es demasiado grande, r = medio- 1, y si es menor que m, significa que la distancia actual de dos secciones es demasiado pequeña l=mid. hasta encontrar un valor que sea exactamente igual.

#include<bits/stdc++.h>
using namespace std;
int l,n,m;
int num[50002];
int find(int x)
{
    
    
    int last=0;
    int cnt=0;
    for(int i=0;i<=n;i++)
    {
    
    
        if(num[i]-last<x) cnt++;
        else last=num[i];
    }
    if(cnt>m) return 0;
    else return 1;
}
int main()
{
    
    
    cin>>l>>n>>m;
    memset(num,0,sizeof num);
    num[n+1]=l;
    for(int i=0;i<n;i++)
        cin>>num[i];
    num[n]=l;
    int x=1,y=l;
    while(x<y)
    {
    
    
        int mid=(x+y+1)/2;
        if(find(mid)) x=mid;
        else y=mid-1;
    }
    cout<<x;
}

Supongo que te gusta

Origin blog.csdn.net/qq_57109165/article/details/122489837
Recomendado
Clasificación