丟瓶蓋 二分

2021-09-10 22:03:25 字數 1199 閱讀 4274

陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?

輸入格式:

第一行,兩個整數,a,b。(b<=a<=100000)

第二行,a個整數,分別為這a個瓶蓋座標。

輸出格式:

僅乙個整數,為所求答案。

輸入樣例#1:複製

5 3

1 2 3 4 5

輸出樣例#1:複製

2
#include#includeusing namespace std;

int arr[100002];

int maxn = 9999999;

int lef, rig, mid;

int a, b;

int tu = 1;

bool judge(int mid)

} return tu >= b;

}int main()

lef = 1;

sort(arr + 1, arr + a + 1);

rig = arr[a] - arr[1];

while (lef<=rig)

else

rig = mid - 1;

} cout << ans << endl;

return 0;

}

我們的做法是二分,左邊距是1,右邊距是兩個端點的座標差值。這裡最重要的點有:

judge函式理解:這個函式在所有的二分中基本都是判斷該解是否正確,那麼我們是用來判斷每兩個硬幣之間的距離都要小於這個解(mid),如果最後tu>=b的話,就表示這個解一定是乙個解,但不一定是最優解,最優解可能在它的右邊,所以返回true,然後用ans暫時儲存這個解(mid),lef=mid+1,開始在右邊尋找最優解,相反,如果tu我們的judge函式裡面其實就是獲取極端情況,也就是迴圈下去,遇到距離大於解的硬幣,就撿起來,並從這個硬幣開始(num=i),然後最後看看這樣可以撿起來多少硬幣,如果硬幣數量大於或等於限定值(b),說明這個解一定是對的,說不定還有最優解,因為其實大於限定值的數量硬幣就不用撿起來,我們只是為了判定極端值(其實也有貪心的思想)

洛谷P1316 丟瓶蓋(二分)

陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?輸入格式 第一行,兩個整數,a,b。b a 100000 第二行,a個整數,分別為這a個瓶蓋座標。輸出格式 僅乙個整數,...

計蒜客 T1878 丟瓶蓋 二分

題目鏈結 陶陶是個貪玩的孩子,他在地上丟了 aa 個瓶蓋,為了簡化問題,我們可以當作這 aa 個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出 bb 個,使得距離最近的 22 個距離最大,他想知道,最大可以到多少呢?輸入格式 第一行,兩個整數,a,b 2 le b le a le 10 5 a,b 2...

P1316 丟瓶蓋 (二分最小值最大化)

陶陶是個貪玩的孩子,他在地上丟了a個瓶蓋,為了簡化問題,我們可以當作這a個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裡找出b個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?輸入格式 第一行,兩個整數,a,b。b a 100000 第二行,a個整數,分別為這a個瓶蓋座標。輸出格式 僅乙個整數,...