您的位置:首页 > 其它

HDOJ-4004/(大连网赛1004)- The Frog's Games 二分答案+验证

2011-09-06 22:33 323 查看
题目在这里 http://acm.hdu.edu.cn/showproblem.php?pid=4004
以前我真的没怎么做过二分答案的。(鄙视我吧...)

显然这题的答案是一个单调序列,二分可以使复杂度为logn

代码:

//hdoj-4004 二分+验证
//1<= L <= 1000,000,000、0<= n <= 500,000、1<= m <= n+1

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

#define MAXN 500002
int l, n, m;
int a[MAXN];

int check(int x)
{
int t = x;
int cnt=0;
for(int i=1; i<n+2; t=x)		//点
{
while(t>=a[i]-a[i-1])		//	i 表示下一个要跳过的点。
{
t-=a[i]-a[i-1];
i++;
}
cnt++;
if(cnt>m) return 0;
}
return 1;
}

int main()
{
while(cin>>l>>n>>m)
{
a[0]=0; a[n+1]=l;
for(int i=1; i<=n; i++)		//n+2个点
{
cin>>a[i];
}
sort(a, a+n+2);				//排序
int min=l%m? l/m+1: l/m;
int max = l;
while(min<max)					//	[min, max]
{
int mid = (min+max)/2;
if(check(mid))
{
max = mid;
}
else
{
min = mid+1;
}
}	//当min=max 跳出
cout<<min<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: