一年一度的「跳石頭」比賽又要開始了!
這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 nn 塊岩石(不含起點和終點的岩石)。在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。
為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比賽過程中的最短跳躍距離盡可能長。由於預算限制,組委會至多從起點和終點之間移走 mm 塊岩石(不能移走起點和終點的岩石)。
第一行包含三個整數 l,n,ml,n,m,分別表示起點到終點的距離,起點和終點之間的岩石數,以及組委會至多移走的岩石數。保證 l \geq 1l≥1 且 n \geq m \geq 0n≥m≥0。
接下來 nn 行,每行乙個整數,第 ii 行的整數 d_i( 0 < d_i < l)di(0乙個整數,即最短跳躍距離的最大值。
輸入 #1複製
25 5 2 211輸出 #1複製1417
21
4輸入輸出樣例 1 說明:將與起點距離為 22和 1414 的兩個岩石移走後,最短的跳躍距離為 44(從與起點距離 1717 的岩石跳到距離 2121 的岩石,或者從距離 2121 的岩石跳到終點)。
另:對於 20\%20%的資料,0 ≤ m ≤ n ≤ 100≤m≤n≤10。
對於50\%50%的資料,0 ≤ m ≤ n ≤ 1000≤m≤n≤100。
對於 100\%100%的資料,0 ≤ m ≤ n ≤ 50,000,1 ≤ l ≤ 1,000,000,0000≤m≤n≤50,000,1≤l≤1,000,000,000。
- 首先想到用暴力搜尋,每次選m個,進行比較。。。。。顯然超時
- 說實話,這道題如果只想著怎麼找哪些石頭需要被搬掉,那這道題真的太難了,我一直想怎麼去掉石頭達到最優。。。結果把自己繞進去了,看了好多題解才知道可以將要求結果列舉出來,然後回代答案,看是否何時,最後得到最優解!!!!這便是這道題的核心所在!!!
- 如果想到列舉長度,直接上二分的板子。寫出來就很簡單了,廢話不多說,直接上**
#include using namespace std;
const int max = 1000005;
const int inf = 0x7fffffff;
int m,n,l;
int a[max];
int main()
int l=0,r=l+1;
while (l<=r) else bl=a[i];
}if(l-blif(cnt<=m) else
}printf("%d\n",l-1);
}
經典演算法 二分查詢
二分查詢這種老生常談的話題,說的很簡單,但是仍然有些大夥不明白,所以這裡希望自己能夠寫出一篇很淺顯易懂的部落格幫助大家理解 給定陣列已經排序好,然後對其進行編號。這裡我們預設是從小到大的,否則演算法就要進行更改了 思想 因為陣列是有序的,所以每次和陣列中間的乙個比較,通過和其大小的關係,然後再折半比...
經典演算法 二分查詢
題目說明 二分查詢法是對一組有序的數字中進行查詢,傳遞相應的資料,進行比較查詢到與原資料相同的資料,查詢到了返回對應的陣列下標,失敗返回 1。題目解析 二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢...
二分法經典例題
三個例題語句大致相同,但是注意判斷語句中的符號有差異,請讀者慢慢體會.一 二 三 二分全部使用的是左閉右閉區間 一 運用範圍 查詢是否存在n元素 include int main int n scanf d n int mid int left 0 int right 4 while left ri...