C 跳石頭題解(二分答案)

2022-08-16 12:24:11 字數 1545 閱讀 7914

跳石頭

描述一年一度的「跳石頭」比賽又要開始了!

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

為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比賽過程中的最短跳躍距離盡可能長。由於預算限制,組委會至多從起點和終點之間移走 m塊岩石(不能移走起點和終點的岩石)。

輸入第一行包含三個整數 l,n,m分別表示起點到終點的距離,起點和終點之間的岩石數,以及組委會至多移走的岩石數。保證l≥1 且n≥m≥0。

接下來 n行,每行乙個整數,第 i行的整數di​(0

輸出乙個整數,即最短跳躍距離的最大值。

輸入樣例 1 

25 5 2211

1417

21輸出樣例 14提示

輸入輸出樣例 1 說明:將與起點距離為 2和 14的兩個岩石移走後,最短的跳躍距離為 4(從與起點距離 17 的岩石跳到距離 21 的岩石,或者從距離 21 的岩石跳到終點)。

另:對於20%的資料,0 ≤ m ≤ n ≤ 100≤m≤n≤10。

對於50%的資料,0 ≤ m ≤ n ≤ 1000≤m≤n≤100。

對於 100%的資料,0 ≤ m ≤ n ≤ 50000,1 ≤ l ≤ 1000000000。

**noip2015 提高 t1

先看資料範圍,l居然達到了驚人的10的8次方,所以我們必須使用一種效率高、耗時少的演算法——沒錯,就是二分(今天學的就是二分啊)。二分演算法每次都會把資料分成兩半,所以其時間複雜度只有logl。反觀暴力列舉,其時間複雜度為l的平方。所以對於這道題來說,二分肯定是最合理的演算法。

既然要使用二分,那就必須決定要分什麼。分移走的石頭位置?沒有任何用處。所以唯一剩下的能分的值就是本道題的答案:最短跳躍距離的最大值。所以我們不妨沿著這條思路走下去。

我們可以首先使用二分求出最短跳躍距離的最大值,然後檢查其是否合法,這裡可以使用乙個bool函式ok來判斷,二分那部分都是老套路了,bool函式ok才是二分的靈魂:

bool ok(int

x)//x為通過二分算出來的最短跳躍距離的最大值

return tot<=m;//如果移走石頭的個數小於等於m,則x的值是可取的

}

解決了ok函式,剩下的部分都是二分老套路,只有r的取值需要注意一下

完整**+注釋如下:

#includeusing

namespace

std;

int d[500010

],l,n,m,l,r;//注意陣列不要開小了

bool ok(int x)//

x為通過二分算出來的最短跳躍距離的最大值

return tot<=m;//

如果移走石頭的個數小於等於m,則x的值是可取的

}int

main()

if(!ok(r)) r=l;//掃尾工作

cout

}

perfect!

跳石頭 二分答案

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

c 二分答案 之 跳石頭

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

二分 跳石頭

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