POJ 3258青蛙過河 二分答案

2021-07-11 22:49:06 字數 1714 閱讀 5159

description

有一條寬度為l(1≤l≤ 1,000,000)的河。河中間有n(0≤n≤20000)塊石頭,青蛙從河西岸經過這n個石塊後,順利跳到了河的東岸。設河中間每個石塊距離西岸的距離為di(其中di大於0小於l)。注意:di是距離起始河岸的距離。 

小明閒著沒事,想移掉河中間的m(0≤m≤n)個石塊,讓一些石塊之間的距離增大一點,好叫青蛙沒那麼容易跳到對岸。 

由於移除m個石塊的方法有多種,所以在移除石塊之前,小明想知道如果他恰好移除河中m個石塊後,青蛙跳的最短距離的最大值可以達到是多少?(青蛙跳一段的距離:西岸與河中第乙個石塊距離、河中相鄰石塊的距離、最後乙個石塊與東岸的距離。青蛙每次都是從乙個石塊跳到與它相鄰的下乙個石塊)。 

input

多組輸入。第一行順序輸入l, n和m。接下來輸入n個正整數(不保證有序),表示n個石塊距離起始河岸的距離。

output

對於組輸入,輸出移除m個石塊後,整個跳躍過程中最短距離的最大值。

sample input

25 5 2214

1121

17

sample output

4

hint

在移除石塊之前,跳躍過程中的最小間距2(起點距第1個石塊)。移除距離起始岸為2和14的石塊後,最小間距就為4了。(0 – 11 – 17 – 21 – 25 )。

**:#include#includeusing namespace std;

const int size = 50002;

int d[size],l,n,m;

int minl,maxl, ans;

bool ok(int x)

if (t > m) return 0;//要使用t次才能滿足答案為x的條件,超過了m,不符合等於m的條件,返回0

}//加上,這一句

//此時tot是最後幾塊合併的值,如果他小於列舉的答案x

//且t==m(也就是你之前把可以拿去m塊石頭的機會都用光了),

//這種情況tot為最小值,所以x不符合條件

if (tot < x && m == t) return 0;

return 1;

}void binary()

}int main()

{

int i, j, k;

//freopen("b.in","r",stdin);

//freopen("tmp.out","w",stdout);

while (scanf("%d%d%d",&l,&n,&m)!=eof)

{for (i = 0; i < n; i++)

scanf("%d",&d[i]);

sort(d,d+n);//排序,計算石頭之間的間距

d[n] = l;//最後塊(也就是對岸)距離起點的距離為l

minl = maxl = ans = d[0];

for (i = n; i > 0; i--)

{d[i] = d[i]-d[i-1];//求石頭間距

//printf("%d ",d[i]);

//if (d[i] == 0) printf("aaa\n");

if (d[i]

POJ 3258 二分 貪心

poj 3258 二分 貪心 一條線段兩個端點之間的距離是l,兩端點之間分布著n個點,這n個點把線段分成了n 1份,現在讓你最多去掉 第一次讀錯題想了很久不知道怎麼做,remove是去掉不是移動,m個點,問n 1份線段最小值的最大值是多少 1 l 109,0 m n 50000 分析類似poj 32...

poj 3258 二分最小值最大

題意 有一些石頭排成一條線,第乙個和最後乙個不能去掉。其餘的共可以去掉m塊,要使去掉後石頭間距的最小值最大。解析 二分石頭,最小值最大。include include include include include include include include include include in...

poj3273 poj3258 二分答案

二分答案的方法比較常用,思想比較簡單,就是從結果出發解決問題,已知答案在某乙個區間中,並且根據某種判定條件,能夠確定當前所選的值是大了還是小了,我們通過二分的方法將其找出來,從而降低時間複雜度。當然,這個判定條件就是二分答案的關鍵啦。通常,判定函式是乙個貪心演算法。二分答案的方法通常用來解決最小值最...