描述
(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件過去就行了.但還是會很累,...