1. 程式人生 > >P1316 丟瓶蓋 AC於2018.11.4

P1316 丟瓶蓋 AC於2018.11.4

原題

題目描述

陶陶是個貪玩的孩子,他在地上丟了A個瓶蓋,為了簡化問題,我們可以當作這A個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出B個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?

輸入輸出格式

輸入格式:

第一行,兩個整數,A,B。(B<=A<=100000)

第二行,A個整數,分別為這A個瓶蓋座標。

輸出格式:

僅一個整數,為所求答案。

輸入輸出樣例

輸入樣例#1: 

5 3
1 2 3 4 5

輸出樣例#1: 

2

說明

限時3秒

【思路】

二分的模板題,直接套模板就好了,詳見這裡

【程式碼】

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<ctype.h>
#include<numeric>
using namespace std;
int n,k;
int a[1000001];
int check(int m)
{
    int tmp=a[1]+m,cnt=1;
    for(int i=2;i<=n;i++)
    if(a[i]>=tmp)
    {
        cnt++;
        tmp=a[i]+m;
    }
    return cnt>=k;
}
int main()
{
    scanf("%d%d",&n,&k);
    int l=1,r=1000000000;
    for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    while(l<r)
    {
        int mid=(l+r+1)/2;
        if(check(mid))
        l=mid;
        else
        r=mid-1;
    }
    printf("%d",l);
    return 0;
}