跳房子,也叫跳飛機,是一種世界性的兒童遊戲,也是中國民間傳統的體育遊戲之一。
跳房子的遊戲規則如下:
在地面上確定乙個起點,然後在起點右側畫 \(n\) 個格仔,這些格仔都在同一條直線上。每個格仔內有乙個數字(整數),表示到達這個 格仔能得到的分數。玩家第一次從起點開始向右跳,跳到起點右側的乙個格仔內。第二次再從當前位置繼續向右跳,依此類推。規則規定:
玩家每次都必須跳到當前位置右側的乙個格仔內。玩家可以在任意時刻結束遊戲,獲得的分數為曾經到達過的格仔中的數字之和。
現在小 \(r\) 研發了一款彈跳機械人來參加這個遊戲。但是這個機械人有乙個非常嚴重的缺陷,它每次向右彈跳的距離只能為固定的 \(d\) 。小 \(r\) 希望改進他的機械人,如果他花 \(g\) 個金幣改進他的機械人,那麼他的機械人靈活性就能增加 \(g\) ,但是需要注意的是,每 次彈跳的距離至少為 \(1\) 。具體而言,當 \(g時,他的機械人每次可以選擇向右彈跳的距離為 \(d-g,d-g+1,d-g+2\) ,…, \(d+g-2\) , \(d+g-1\) , \(d+g\) ;否則(當 \(g \geq d\) 時),他的機械人每次可以選擇向右彈跳的距離為 \(1\) , \(2\) , \(3\) ,…, \(d+g-2\) , \(d+g-1\) , \(d+g\) 。
現在小 rrr 希望獲得至少 \(k\) 分,請問他至少要花多少金幣來改造他的機械人。
輸入格式:
第一行三個正整數 \(n\) , \(d\) , \(k\),分別表示格仔的數目,改進前機械人彈跳的固定距離,以及希望至少獲得的分數。相鄰兩個數 之間用乙個空格隔開。
接下來 \(n\) 行,每行兩個正整數 \(x_i,s_i\) ,分別表示起點到第 \(i\) 個格仔的距離以及第 \(i\) 個格仔的分數。兩個數之間用乙個空格隔開。保證 \(x_i\) 按遞增順序輸入。
輸出格式:
共一行,乙個整數,表示至少要花多少金幣來改造他的機械人。若無論如何他都無法獲得至少 \(k\) 分,輸出 −1 。
輸入樣例#1:
7 4 10
2 65 -3
10 3
11 -3
13 1
17 6
20 2
輸出樣例#1:
輸入樣例#2:
7 4 20
2 65 -3
10 3
11 -3
13 1
17 6
20 2
輸出樣例#2:
-1【輸入輸出樣例 1 說明】
花費 2 個金幣改進後, 小 r 的機械人依次選擇的向右彈跳的距離分別為 2, 3, 5, 3, 4,3, 先後到達的位置分別為 2, 5, 10, 13, 17, 20, 對應 1, 2, 3, 5, 6, 7 這 6 個格仔。這些格仔中的數字之和 15 即為小 r 獲得的分數。
由於樣例中 7 個格仔組合的最大可能數字之和只有 18 ,無論如何都無法獲得 20 分
本題共 10 組測試資料,每組資料 10 分。
對於全部的資料滿足 \(1 ≤ n ≤ 500000, 1 ≤ d ≤2000, 1 ≤ x_i, k ≤ 10^9, |si| < 10^5\) 。
對於第 1, 2 組測試資料, n ≤ 10;
對於第 3, 4, 5 組測試資料, n ≤ 500
對於第 6, 7, 8 組測試資料, d = 1
一句話題意:不花錢每次可以走\(d\)的距離,一開始在0的位置,到達乙個位置就可以獲得這個位置的權值,花\(g\)個金幣就可以走\([max(1, d-g), d+g]\)的距離(必須要走到乙個正好有乙個點的位置才能走),問至少要花多少個金幣才能在任意位置獲得大於等於\(k\)的權值,如果不能則輸出-1.
題解:首先看著這個神奇的花費,應該想到的是二分,因為這個移動的距離是與金幣的使用量有關的,金幣使用得越多則可以走到的距離也就越多,事實上這個是具有單調性的,所以二分來列舉答案.
然後我們來考慮一下如何驗證.顯然直接列舉可以轉移狀態的所有情況需要\(o(n^2)\)的時間複雜度.所以這考慮優化.因為這個可轉移的狀態也是可以遞推的,也就是說假設有乙個狀態先\(x\)無法轉移到狀態\(y\),且狀態\(z\)在\(y\)之後,那麼\(x\)就一定無法轉移\(z\)(這裡的狀態指的是第幾個點,也就是第幾個位置).那麼根據這個性質可以用單調佇列來優化.
如果單調佇列不會寫,可以先看看這道題:滑動視窗
那麼以滑動視窗的思想來理解的話,就是把所有\(
while(i>='0'&&i<='9')
return ans * f;
}void push(int x)
bool check(int mid)
return false;
}int main()
printf("%d\n", ans);
return 0;
}
洛谷P3957 跳房子
普及組的題。我不會。題目 思路很簡單,就是二分答案 dp 單調佇列 線段樹也可以 但是要注意細節,乙個細節錯了,一半分數就沒了。引用洛谷上某大佬的一段話 發現答案的可行區間是單調的,所以二分答案,容易推出f i 表示到達第i個格仔的最大值,列舉上一步跳了多少來轉移 然後仔細觀察可以發現對於乙個狀態,...
洛谷P3957 跳房子
普及組的題.填坑來了。當年的我一眼二分 dp,現在都佩服起自己來了.然後我們就寫個二分,在check裡面寫單調佇列優化dp即可。然後就a了.1 include 2 include 3 include 4 5 typedef long long ll 6 const int n 500010 7 co...
題解 P3957 跳房子
題目鏈結 題目大意 給定 n 個格仔離原點距離以及權值,初始單次移動距離只能為 d 你可以花費 g 枚金幣使得單次移動距離變為 max d g,1 d g 內任意整數,問獲得權值至少為 k 最少需要花費多少枚金幣 單調佇列 分析 顯而易見答案具有單調性,因為花費金幣越多機械人越靈活,花費金幣少的可行...