标签:style blog http color os io for 问题 div
题目链接:http://poj.org/problem?id=2456
题目翻译:
农夫约翰搭建了一间有N间牛舍得小屋,牛舍排在一条直线上,第i号牛舌在Xi的位置。但是他的M头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。
限制条件
2<=N<=100000
2<=M<=N
0<=Xi<=10^9
思路: <挑战程序设计竞赛>中的模板题目,是一个求最大的最小值问题。首先我们构建基本的解题框架。二分+贪心。用二分思想对距离进行枚举并判断是否符合要求,直到找到最大值。那么如何进行判断呢?我们进行排序贪心即可。
代码:
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int n,m; int a[100001]; //判断函数 int j(int x) { int c,last; last = 1; for(int i=1;i<m;i++) { c = last+1; while(c<=n&&a[c]-a[last]<x) { c++; } if(c==n+1) return false; last = c; } return true; } int main() { int r,l,mid; while(scanf("%d %d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",a+i); } //排序 sort(a,a+n+1); l = 0; r = 1000000000; //二分 while(l+1<r) { mid = (r+l)/2; if(j(mid)==true) { l = mid; } else { r = mid; } } printf("%d\n",l); } return 0; }
标签:style blog http color os io for 问题 div
原文地址:http://www.cnblogs.com/ltwy/p/3940195.html