POJ 3258 River Hopscotch(最小值最大化)

题目链接:点击这里
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<map>
#include<set>

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 50010;
int a[maxn], d[maxn];
int l, n, m;

//当前mid大于时返回false,当前mid小于等于时返回true
bool check(int mid)
{
	int cnt = 0, i = 1;
	bool flag = false;
	while(i <= n+1)
	{
		int tmp = d[i];
		while(tmp<mid)
		{
			cnt++;
			if(cnt>m)	return false;
			tmp += d[++i];
		}
		++i;
	}
	return cnt <= m;
}

int main()
{
	scanf("%d%d%d", &l, &n, &m);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	sort(a+1, a+n+1);
	
	for(int i = 1; i <= n; i++)
		d[i] = a[i] - a[i-1];
	d[n+1] = l - a[n];
	
	int maxx = -1;
	for(int i = 1; i <= n+1; i++)
		if(d[i]>maxx)	maxx = d[i];
	
	int left = 0, right = maxx, ans;
	while(left <= right)
	{
		int mid = left+(right-left)/2;	//二分
		if(check(mid))
		{
			ans = mid;		//记录答案
			left = mid + 1;		//移动left(或right)
		}
		else
		{
			right = mid - 1;	//移动right(或left)	
		}
	}
	printf("%d\n", ans);
	return 0;
}
发布了690 篇原创文章 · 获赞 103 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104071404
今日推荐