河裡面的石頭 二分

2021-10-02 23:54:16 字數 1477 閱讀 1040

題目描述

有一條河,河中間有一些石頭,已知石頭的數量和相鄰兩塊石頭之間的距離。現在可以移除一些石頭,問最多移除m塊石頭後(首尾兩塊石頭不可以移除),相鄰兩塊石頭之間的距離的最小值最大是多少。

輸入格式

多組輸入(<=20組資料,讀入以eof結尾)

每組第一行輸入兩個數字,n(2<=n<=1000)為石頭的個數,m(0<=m<=n-2)為可移除的石頭數目

隨後n-1個數字,表示順序和相鄰兩塊石頭的距離d(d<=1000)

輸出格式

每組輸出一行結果,表示最大的點數

樣例輸入

4 11 2 3

樣例輸出

題意:在河裡有n塊石頭,你可以移動至少m塊石頭(第一塊和最後一塊是不能被移走的),求移走至少m塊石頭後,相鄰石頭之間的最小距離的最大值。

思路:由於題目要求最小距離的最大值,就想到二分,這個題要求的就是最小值的極大化;移動的數目肯定要是m才是最優的,不妨設d是已知的,現在來考慮c(d)怎麼來寫?

(1).迴圈算出相鄰之間的石頭,如果小於d,則移動這塊石頭;否則就算下乙個相鄰的石頭;

(2).最後考慮移動石頭的數目如果小於等於m,則列舉長度偏小了;如果移動石頭數目大於m,則列舉長度偏大了。

**:

#include

#include

using

namespace std;

const

int maxn=

1e3+5;

int arr[maxn]

,ans[maxn]

;int n,m;

//n為石頭數量,m為可移動數量;

bool

solve

(int middle)

//middle代表最短距離中的最大值

if(rocknum>m)

//如果移動的石頭超過m,則列舉長度偏大了

return

false

;return

true

;//列舉長度偏小了

}int

main()

int low=

0,high=

1000

*1000+5

;//下限為0,上線只要滿足l+right大於河長就行

while

(high-low>1)

printf

("%d\n"

,low);}

return0;

}

最後說一下關於二分題的思路:

最小值極大化:

//初始化low和high 

while

(high-low>1)

最大值極小化:

//初始化low和high  

while

(high-low>1)

c(mid)方法就是我們要根據題意自己寫的演算法;

二分 跳石頭

一定要學好程式設計。一年一度的 跳石頭 比賽又要開始了 這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選 擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 n 塊岩石 不含起點和終 點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達 終點。為了提...

跳石頭 二分答案

題目背景 一年一度的 跳石頭 比賽又要開始了 題目描述 這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 nnn 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。為了提高...

二維陣列裡面的數進行二分查詢

對乙個row colunms 的二維陣列進行二分查詢 其中對乙個row colunms 的二維陣列進行二分查詢其中每行每列的數滿足從左到右從上到下逐漸變大 資料 override public void run public class searchnumber 二維陣列賦值 int right n...