洛谷P1824進擊的奶牛

2021-08-21 19:53:51 字數 1368 閱讀 3850

題目描述

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想把這些牛安置...