1433:【例題1】憤怒的牛

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

【輸入】
第一行:空格分隔的兩個整數N和C;

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

【輸出】
一個整數,最大的最小值。

【輸入樣例】
5 3
1 2 8 4 9
【輸出樣例】
3
【提示】
把牛放在148這樣最小距離是3

刷這種二分的感覺還是很爽的,但是提交出現運行錯誤的時候,才發現while循環需要加上i<=n

#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define ll long long
ll a[N], l, r;
int main(){
	int n, c;
	scanf("%d %d",&n, &c);
	for(int i=1; i<=n; i++)
		scanf("%lld", &a[i]);
	sort(a+1, a+n+1);
	r = a[n]-a[1];
	while(l < r){
		ll mid = l + ((r-l)>>1), res = 0;
		for(int i=1; i<=n; i++){
			int t = i;
			while(a[i+1] - a[t] < mid && i <= n)//會運行超時  所以加上i<=n! 
				i++;
			++res;
		}
		if(res >= c)
			l = mid + 1;
		else if(res < c)
			r = mid;
	}
	printf("%lld",l-1);
	return 0;	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章