陶陶是個貪玩的孩子,他在地上丟了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個瓶蓋座標。輸出格式 僅乙個整數,...