本文主要是介绍poj 3258 二分最小值最大,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
有一些石头排成一条线,第一个和最后一个不能去掉。
其余的共可以去掉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 LOCALfreopen("in.txt", "r", stdin);
#endif // LOCALwhile (~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;elsehi = mi;}printf("%lld\n", lo);}return 0;
}
这篇关于poj 3258 二分最小值最大的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!