poj 3258 BinarySearch 最大化最小值

来源:互联网 发布:java 异常处理机制5种 编辑:程序博客网 时间:2024/05/19 23:24

题目链接:http://poj.org/problem?id=3258

 

思路:二分法查找的应用(最大化最小值)

从0~INF进行二分法查找,每次折半,将其值带入检验是否合理,根据结果不断更新查找范围,这是二分法题目大致步骤。

就此题来说,有几点需要注意:

1.起点的值是0,即rock[0]=0;   //在此处wa了好多次~~

2.关于统计需要删除的点的个数,我纠结了好久,不确定那种方法删除点的个数是最少的,后来发现只要一直删右边的点即可(终点除外)(关于这点我还是有点纳闷)。

 

详细看代码

 

code:

#include <cmath>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>#include <map>#include <set>#include <list>#include <queue>#include <stack>#include <vector>#include <assert.h>using namespace std;#define SIZE 50005#define INF 1000000005int L,N,M;int rock[SIZE];bool C(int d){    int mark=0;    int j=0;    //因为左边的点都是满足题意的 所以一直删右边的即可    for(int i=1;i<=N;i++){        if(rock[i]-rock[j]<d) mark++;        else j=i;    }    if (mark>M) return false;    return true;}int main(){    scanf("%d%d%d",&L,&N,&M);    for(int i=1;i<=N;i++) scanf("%d",&rock[i]);    N++;    rock[0]=0;    rock[N]=L;    sort(rock,rock+(N+1));    //初始化范围    int lb=0,ub=INF;    while(ub-lb>1){        int mid=(ub+lb)/2;        //如果是最小化的话则lb和ub的位置互换        if (C(mid)) lb=mid;        else ub=mid;    }    printf("%d\n",lb);}


 

 

 

0 0
原创粉丝点击