您的位置:首页 > 编程语言 > C语言/C++

poj之旅——3258C++

2016-06-05 11:31 423 查看
二分题最小值最大化的模式:

[l,r)的左端点l为最小可行数,r为最大可能可行数+1,中位数check(mid),true则趋向问题的求大求小,false则反向,最后输出l。

参考程序:

#include<cstdio>
#include<algorithm>
#define maxn 51000
using namespace std;
int p[maxn];
int L,n,m;
bool Check(int k){
int last=0,cnt=0;
for (int i=0;i<n;i++)
if (p[i]-last<k)cnt++;
else last=p[i];
return cnt<=m;
}
int main(){
scanf("%d%d%d",&L,&n,&m);
for (int i=0;i<n;i++)scanf("%d",&p[i]);
p[n++]=L;
sort(p,p+n);
int l=0,r=L+1;
while (l+1<r){
int mid=(l+r)>>1;
if (Check(mid))l=mid;
else r=mid;
}
printf("%d",l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: