POJ 3258.River Hopscotch

来源:互联网 发布:手机mysql服务器 编辑:程序博客网 时间:2024/06/06 18:48

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

AC代码(C++):

#include <iostream>#include <algorithm>#include <stdio.h>#include <vector>#include <queue>#include <map>#include <math.h>#include <string>#include <string.h>#include <bitset>#define INF 0x7fffffff#define MAXN 100105using namespace std;struct cmp1  {       bool operator ()(int x, int y)      {          return x > y;    }  };int l,n,m;int low,high,mid;int a[50010];bool isBigger(){int cnt = 0;int last = 0;for(int i = 1; i <= n + 1; i++){if(a[i]-a[last]<mid)cnt++;else last = i;}if(cnt>m)return true;else return false;}int main(){priority_queue<int, vector<int>, cmp1>q;cin>>l>>n>>m;low = INF;high = 0;a[0] = 0;a[n + 1] = l;int tmp;for(int i = 1; i <= n; i++){scanf("%d",&tmp);q.push(tmp);}for(int i = 1; i <= n; i++){a[i] = q.top();q.pop();if(a[i]-a[i-1]>high)high = a[i]-a[i-1];if(a[i]-a[i-1]<low)low = a[i]-a[i-1];}if(a[n+1]-a[n]>high)high = a[n+1]-a[n];if(a[n+1]-a[n]<low)low = a[n+1]-a[n];mid = (low+high)/2;while(low<=high){if(isBigger())high = mid - 1;else low = mid + 1;mid = (low+high)/2;}cout<<mid;}
总结: 二分搜索. 注意上下界.