poj2456(二分)

来源:互联网 发布:棒球器材知乎 编辑:程序博客网 时间:2024/05/17 23:09


题意:最大化最小值,将m个物体放入n个位置中,使得每个物体的相差的最小值最大;

思路:二分枚举答案,看是否符合

Code:

#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e5 + 10;int a[maxn];int n,m;bool is_(int d){    int temp = a[1],cnt = 1;    for(int i = 2; i <= n; i ++)    {        if(a[i] - temp >= d)        {            cnt ++;            temp = a[i];        }    }    if(cnt >= m)    {        return true;    }    return false;}int main(){    while( ~ scanf("%d%d",&n,&m))    {        for(int i = 1; i <= n; i ++)            scanf("%d",&a[i]);        sort(a+1,a+n+1);        int l = 1,r = a[n] - a[1];        int T = 60;        while(T --)        {            int mid = (l + r) >> 1;            if(is_(mid))            {                l = mid;            }            else r = mid;        }        cout << l << endl;    }    return 0;}