[LUOGU] P1316 丟瓶蓋

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

輸入輸出格式
輸入格式:
第一行,兩個整數,A,B。(B<=A<=100000)

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

輸出格式:
僅一個整數,爲所求答案。

輸入輸出樣例
輸入樣例#15 3
1 2 3 4 5
輸出樣例#12
說明
限時3

終於找到一個心儀的、不容易寫錯的二分答案模板了,ans在二分中同時保存。

#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN=100005;

int n,m;

int a[MAXN];

bool check(long long x){
    int sum=a[1],cnt=1;
    for(int i=2;i<=n;i++){
        if(a[i]-sum>=x) sum=a[i],cnt++;
    }
    return cnt>=m;
}

int main(){
    cin>>n>>m;
    long long l=0,r=1152921504606846976,mid;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    int ans;
    while(l<=r){
        mid=(l+r)/2;
        if(check(mid)) l=mid+1,ans=mid;
        else r=mid-1;
    }
    cout<<ans<<endl;
    return 0;
}
發佈了180 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章