題目描述
farmer john建造了乙個有n(2<=n<=100,000)個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,…,xn (0<=xi<=1,000,000,000)。
他的c(2<=c<=n)頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些牛安置在指定的隔間,所有牛中相鄰兩頭的最近距離越大越好。那麼,這個最大的最近距離是多少呢?
輸入輸出格式
輸入格式:
第1行:兩個用空格隔開的數字n和c。
第2~n+1行:每行乙個整數,表示每個隔間的座標。
輸出格式:
輸出只有一行,即相鄰兩頭牛最大的最近距離。
輸入輸出樣例
輸入樣例#1:
5 3
1 2
8 4
9輸出樣例#1:
3
**對於 最小值最大化 和 最大值最小化,採用的是二分答案!**
*像這種求最大最小值,最小最大值得問題都是典型的二分答案題,二分答案的主要難點在於juge()函式,此題下面給出了兩個不同思路的juge函式。
要注意的是如何根據所列舉的答案來將隔間分隔,因為求的是最大的最近距離,這個距離要是每一次分隔距離中最短的。接下來分析,假設隔間的座標沒有規定在哪的話,那麼什麼時候最近距離最大呢?毫無疑問,是當所有的距離
相同的時候,最近距離最大。但是此題每個隔間的座標有規定,使得不一定能使每一段的距離都能夠相等,所以,此時求最近距離的最優思路就是:
每一段區間距離都應該大於或等於m(但要盡可能的接近最近距離),這樣才能使最近距離最大
所以一旦所列舉的隔間距離恰好大於最近距離的時候,就在該隔間放牛,毫無疑問,這樣得到的最近距離才會盡可能的大*
判斷函式!
bool juge(int m)//判斷距離m是否可以
return
true;
}
#include
#include
#include
#include
#include
using
namespace
std;
int n,c,p;
int a[1000100];
bool check(int x)
return
true; // 合法!
}int main()
if(check(r))
printf("%d\n",r);
else
printf("%d\n",l);
return
0;}
洛谷 P1824 進擊的奶牛
原題 farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些...
洛谷 P1824 進擊的奶牛
又是一道二分答案啊 如果發現題意是 最小值最大 最大值最小 最優解 那麼就要思考是不是用二分答案寫了 其實還是一道跳石頭 奶牛跳房子 不懂可以看下這題我的題解 建議先做做跳石頭 把牛棚當作石頭,把牛的總數當作必須有的石頭數,那麼牛棚總數減去牛的總數就是可以移開石頭的個數 然後就是跳石頭啦 但寫法有一...
洛谷 P1824 進擊的奶牛
farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些牛安置...