vijos 1471 線性DP 貪心

2022-05-20 10:48:13 字數 1716 閱讀 1829

描述

(ps:你可以認為有n+1個裝置,即需要求多少次能條到第n+1個裝置)

格式

輸入格式

輸入的第1行包含兩個正整數n,m,為裝置的數目以及詢問的次數。

第2行包含n個正整數,第i個正整數為a[i],即第i個裝置向反方向最大跳躍的長度。

第3行包含了m個正整數,為詢問從哪乙個裝置開始,最少要幾次跳到第n個的後方。

數字之間用空格隔開。 輸出格式 輸出包含1行,這一行有m個正整數,對於每乙個詢問,輸出最少需要踩的裝置數,數字之間用空格隔開。

行末換行且沒有多餘的空格。

樣例1

樣例輸入

5 52 4 1 1 1

1 2 3 4 5

樣例輸出

1 2 1 2 2 1

限制

對於20%的資料,有n≤10;

對於40%的資料,有n≤100,m≤10;

對於60%的資料,有n≤1000,a[i]≤1000,m≤500;

對於100%的資料,有n≤100000,a[i]≤n,m≤40000。

時限1s

提示 若從第1個裝置開始則跳到第2個裝置,接著就可以跳到第n個裝置的後方。 若從第3個裝置開始則同樣跳到第2個裝置。 若從第4個裝置開始可以跳到第2個裝置或最後乙個裝置,接著跳出第n個裝置,答案同樣為2。

題意:中文題。

思路:不斷從左到右,直到找到乙個能跳到右邊界r外的位置,定它為左邊界l,dp[l] = dp[r] + 1,在 l 到 r 間的位置間進行判斷,如果某個位置能夠跳到右邊界外,那麼說明該位置可以通過跳到右邊界再跳到下乙個位置,即步數dp[i] = dp[r] + 1,而如果不能跳到右邊界,那麼通過左邊界跳到右邊界,即dp[i]=dp[l]+1,題目的單調性使這樣的策略可行。

/** @date    : 2016-11-18-13.59

* @author : lweleth ([email protected])

* @link :

* @version :

*/#include #include

#include #include #include #include #include #include #include #include #include #include //#include#define ll long long

#define mmf(x) memset((x),0,sizeof(x))

#define mmi(x) memset((x), inf, sizeof(x))

using namespace std;

const int inf = 0x3f3f3f3f;

const int n = 1e6+2000;

using namespace std;

//high[i] means pi(n/i),low[i] means pi(i)

ll high[340000];

ll low[340000];

ll n;

ll fun()

for(x = m; x >= p*p; x--)

low[x] -= low[x/p] - low[p-1]; }}

int main()

}

vijos1471 教主的遊樂場

輸入的第1行包含兩個正整數n,m,為裝置的數目以及詢問的次數。第2行包含n個正整數,第i個正整數為a i 即第i個裝置向反方向最大跳躍的長度。第3行包含了m個正整數,為詢問從哪乙個裝置開始,最少要幾次跳到第n個的後方。數字之間用空格隔開。輸出包含1行,這一行有m個正整數,對於每乙個詢問,輸出最少需要...

B Array Walk 線性dp , 貪心

題目大意 給定我們乙個陣列,對於位置x你每次可以執行兩種操作。1.向右移動乙個單位,x x 1 2.向左移動乙個單位,x x 1 但是有規定,你一共可以執行 k 次操作,且這 k 次操作種操作2做多只能執行 z 次 且操作2不能被連續執行。分析解法一 動態規劃方法 一開始思考用貪心的思路去解決,但是...

HDU 1421 搬寢室 線性dp 貪心預處理

problem description 搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,...