nyoj 586 瘋牛(二分 貪心)

2021-07-04 16:44:38 字數 1522 閱讀 8865

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

農夫 john 建造了一座很長的畜欄,它包括n (2 <= n <= 100,000)個隔間,這些小隔間依次編號為x1,...,xn (0 <= xi <= 1,000,000,000).

但是,john的c (2 <= c <= n)頭牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡,他們就要發生爭鬥。為了不讓牛互相傷害。john決定自己給牛分配隔間,使任意兩頭牛之間的最小距離盡可能的大,那麼,這個最大的最小距離是什麼呢?

輸入

有多組測試資料,以eof結束。

第一行:空格分隔的兩個整數n和c

第二行——第n+1行:分別指出了xi的位置

輸出每組測試資料輸出乙個整數,滿足題意的最大的最小值,注意換行。

樣例輸入

5 312

849

樣例輸出

3題意要表達的是:把c頭牛放到n個帶有編號的隔間裡,使得任意兩頭牛所在的隔間編號的最小差值最大。例如樣例排完序後變成1 2 4 8 9,那麼1位置放一頭牛,4位置放一頭牛,它們的差值為3;最後一頭牛放在8或9位置都可以,和4位置的差值分別為4、5,和1位置的差值分別為7和8,不比3小,所以最大的最小值為3。

分析:這是乙個最小值最大化的問題。先對隔間編號從小到大排序,則最大距離不會超過兩端的兩頭牛之間的差值,最小值為0。所以我們可以通過二分列舉最小值來求。假設當前的最小值為x,如果判斷出最小差值為x時可以放下c頭牛,就先讓x變大再判斷;如果放不下,說明當前的x太大了,就先讓x變小然後再進行判斷。直到求出乙個最大的x就是最終的答案。

cpp:

#include #include #define max_size 100020

int x[max_size];

int n,c;

int com(const void *a,const void *b)//排序

bool judge(int v)

printf("%d\n",bottom);

} return 0;

}

#include#include int cmp(const void*a,const void *b)

int a[1000001];

int main()

m++;

}if(sum>=c-1)//如果這種情況是大於c-1頭牛的,說明答案在 【mid+1,max】中

else //如果這種情況是小於c-1頭牛的,說明答案在 【min,mid-1】中

}printf("%d\n",min-1);

}return 0;

}

這個是貪心和二分.二分查詢又是折半查詢,首先,元素是公升序排列,每次查詢中間元素和待查詢元素進行比較,如果相同,就返回中間元素的位置值,如果不相同且中間元素大於待查詢元素就從右邊開始,如果不相同且中間元素小於待查詢元素就從左邊開始,適用於不經常變動而且查詢頻繁的有序列表。

NYOJ 586 瘋牛(貪心 二分)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 農夫 john 建造了一座很長的畜欄,它包括n 2 n 100,000 個隔間,這些小隔間依次編號為x1,xn 0 xi 1,000,000,000 但是,john的c 2 c n 頭牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間...

NYOJ 586 瘋牛 二分

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 農夫 john 建造了一座很長的畜欄,它包括n 2 n 100,000 個隔間,這些小隔間依次編號為x1,xn 0 xi 1,000,000,000 但是,john的c 2 c n 頭牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間...

NYOJ586 瘋牛(貪心 二分搜尋)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4描述 農夫 john 建造了一座很長的畜欄,它包括n 2 n 100,000 個隔間,這些小隔間依次編號為x1,xn 0 xi 1,000,000,000 但是,john的c 2 c n 頭牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡...