1. 程式人生 > >Aggressive cows 憤怒的牛

Aggressive cows 憤怒的牛

led become 可能 ica event 更新 pos them ios

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000). His C (2 <= C <= N) cows don‘t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

農夫 John 建造了一座很長的畜欄,它包括N (2 <= N <= 100,000)個隔間,這些小隔間依次編號為x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)頭牛們並不喜歡這種布局,而且幾頭牛放在一個隔間裏,他們就要發生爭鬥。為了不讓牛互相傷害。John決定自己給牛分配隔間,使任意兩頭牛之間的最小距離盡可能的大,那麽,這個最大的最小距離是什麽呢

輸入

* Line 1: Two space-separated integers: N and C * Lines 2..N+1: Line i+1 contains an integer stall location, xi

第一行:空格分隔的兩個整數N和C

第二行---第N+1行:i+1行指出了xi的位置

輸出

* Line 1: One integer: the largest minimum distance

第一行:一個整數,最大的最小值

樣例輸入

5 3
1
2
8
4
9

樣例輸出

3



(把牛放在1,4,8這樣最小距離是3 )
先將柵欄排序,然後取最大間隔可能的區間0到(最遠距離除牛數減1),對這個區間進行二分查找最大可行距離即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn=1e5+100;
using namespace std;
int a[maxn],n,m;
bool judge(int x)//判斷這個距離是否可行
{
	int l,r,t,i;
	l=1;r=1;t=1;
	while(r<=n) {
		while(r<=n&&a[l]+x>a[r]) r++;//尋找到這個間隔下的的下一個可行點
		if(r>n) break;//如果下一個可行點超出範圍這結束
t++;//否則牛的數量加1 l=r;//更新當前的最遠可行點 if(t==m) break;//如果牛放的下 } if(t==m) return true;//表示這個點滿足 else return false; } int main() { int i,j,num,sum,mid; cin>>n>>m; sum=0; for(i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n);//貪心
num=a[n]/(m-1);//初始最大間隔
int l=0,r=num; while(r-l>1) { mid=(l+r)/2;//二分查找 if(judge(mid)) l=mid;//如果可行則使左邊變成這個值 else r=mid;//如果值太大則是右邊變成這個值
} cout<<l; return 0; }

  

Aggressive cows 憤怒的牛