Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5436 | Accepted: 2720 |
Description
Input
Output
Sample Input
5 3 1 2 8 4 9
Sample Output
3
Hint
Source
解题思路:
这道题虽然不长,可是读了好几遍才读懂。有n个牛舍,每个牛舍有自己的位置xi(可以理解为坐标),把c头牛放在这n个牛舍里面,要求最近的两头牛之间的最大距离。
比如测试数据 5个牛舍 3头牛 牛舍坐标1 2 8 4 9
先按贪心,第一头牛肯定被放在第一个牛舍里,排序 1 2 4 8 9
第二头牛可以放在2,也可以放在4,假设第二头牛放在2 ,与第一头牛的距离为1 ,假设第三头放在9,与第二头的距离为7,那么,最近的两头牛之间的最大距离为1
最有解为 第一头牛放在1 第二头牛放在4 ,第三头牛放在9 ,那么 4-1=3 9-4=5 ,最近的两头牛之间的最大距离为3
也就是求相邻两头牛之间距离的最小值(取最大)。这个距离采用二分的形式进行判断。
代码:
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; const int maxn=100002; const int inf=0x7fffffff; int x[maxn]; int n,c; bool ok(int m) { int last=0; for(int i=1;i<c;i++) { int cur=last+1;//cur指当前的牛舍位置 while(cur<n&&x[cur]-x[last]<m) cur++; if(cur==n)//只放下第一头牛,无法放下第二头牛,使二者的距离大于等于m return false; last =cur;//把第i头牛放在编号为cur的牛舍里,这里牛的头数和牛舍的编号都是从0开始的 } return true; } int main() { cin>>n>>c; for(int i=0;i<n;i++) scanf("%d",&x[i]); sort(x,x+n); int l=0,r=inf;//这里r也可以写成题目里的最大距离1000000000 for(int i=0;i<100;i++) { int m=(l+r)/2; if(ok(m)) l=m; else r=m; } cout<<l<<endl; return 0; }
[ACM] poj 2456 Aggressive cows (二分查找),码迷,mamicode.com
[ACM] poj 2456 Aggressive cows (二分查找)
原文地址:http://blog.csdn.net/sr_19930829/article/details/24667065