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