POJ 2456 (二分&三分_F题)解题报告
题目链接:http://poj.org/problem?id=2456
--------------------------------------------------------
题意:N个点放置C头牛,使得两头牛之间距离最小。
思路:二分最大化最小值问题,二分标准分隔距离,判断标准分隔组数与要求牛数的关系。如果分隔组数大于牛数,距离可以增大,反之,距离要减小。
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =1e5+10; long long int a[MAXN]; int N =0; int C =0; int jud(int mid){ int h =a[0]; int count =1; for(int q=1;q<N;q++){ if(a[q]-h>=mid){ h=a[q]; count++; } } if(count>=C) return 1; else return 0; } int bsearch(){ int left =0; int right = a[N-1]-a[0]; int mid; while(right>=left){ mid=(right-left)*0.5+left; if(jud(mid)){ left =mid+1; }else{ right =mid-1; } } return right;//注意极端数据点 } int main(void){ scanf("%d %d",&N,&C); for(int i=0;i<N;i++){ scanf("%lld",&a[i]); } sort(a,a+N); printf("%d\n",bsearch()); return 0; }

浙公网安备 33010602011771号