poj 3258 二分最小值最大

来源:互联网 发布:win7启用网络发现 编辑:程序博客网 时间:2024/06/13 13:52

题意:

有一些石头排成一条线,第一个和最后一个不能去掉。

其余的共可以去掉m块,要使去掉后石头间距的最小值最大。


解析:

二分石头,最小值最大。


代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <climits>#include <cassert>#define LL long longusing namespace std;const int inf = 0x3f3f3f3f;const double eps = 1e-8;const double pi = acos(-1.0);const double ee = exp(1.0);const int maxn = 50000 + 10;LL dis[maxn];LL l;int n, m;bool ok(LL k){    int cnt = 0;    int t = 0;    while (t < n)    {        int p = t + 1;        while (dis[p] - dis[t] < k)        {            cnt++;            p++;        }        t = p;    }    return cnt <= m;//<=  其他wa}int main(){#ifdef LOCAL    freopen("in.txt", "r", stdin);#endif // LOCAL    while (~scanf("%lld%d%d", &l, &n, &m))    {        dis[0] = 0;        for (int i = 1; i <= n; i++)        {            scanf("%lld", &dis[i]);        }        dis[++n] = l;        sort(dis, dis + n);        LL lo = 0, hi = 1000000000;        for (int i = 1; i <= 100; i++)        {            LL mi = (lo + hi) >> 1;            if (ok(mi))                lo = mi;            else                hi = mi;        }        printf("%lld\n", lo);    }    return 0;}


0 0
原创粉丝点击