vijos1471 教主的遊樂場

2021-07-26 05:00:44 字數 1388 閱讀 7170

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

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

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

數字之間用空格隔開。

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

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

5 5

2 4 1 1 1

1 2 3 4 5

2 1 2 2 1

若從第1個裝置開始則跳到第2個裝置,接著就可以跳到第n個裝置的後方。

若從第3個裝置開始則同樣跳到第2個裝置。

若從第4個裝置開始可以跳到第2個裝置或最後乙個裝置,接著跳出第n個裝置,答案同樣為2。

對於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

膜拜教主,膜拜liu932073956的題解:

o(n) 演算法:

首先從右向左找到最左邊的能一步到達n+1點的點 設這個點為i,以這個i點為左邊界,以n點為右邊界,這個區間內的點只有兩種情況:1.如果能直接跳到n+1點 那麼步數為1;2.否則步數為二(跳到i點然後到n+1點);然後以i-1點為右邊界,繼續向左找能一步到達i點的最左邊的點,設為點j 那麼區間(j,i-1)內的點也只有兩種情況:1.如果能跳到i點 那麼步數為 i點的步數+1,2.如果跳不到,那麼步數為i點步數+2(先跳到j點,再跳到i點)

以此類推,直到掃到左邊界 複雜度o(n);

不過這個題解似乎有點點問題,應該是從左到右找左邊界,也許是我沒有理解吧。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

inline

const

int get_int()

while(x>='0'&&x<='9')

return num*bj;

}int n,m,a[100005],f[100005];

int main()

for(int i=1; i<=m; i++)printf("%d ",f[get_int()]);

return

0;}

vijos 1471 線性DP 貪心

描述 ps 你可以認為有n 1個裝置,即需要求多少次能條到第n 1個裝置 格式 輸入格式 輸入的第1行包含兩個正整數n,m,為裝置的數目以及詢問的次數。第2行包含n個正整數,第i個正整數為a i 即第i個裝置向反方向最大跳躍的長度。第3行包含了m個正整數,為詢問從哪乙個裝置開始,最少要幾次跳到第n個...

Vijos1617 超級教主

orz4 3 jump lhx教主很能跳,因為orz他的人太多了。教主跳需要消耗能量,每跳1公尺就會消耗1點能量,如果教主有很多能量就能跳很高。教主為了收集能量,來到了乙個神秘的地方,這個地方凡人是進不來的。在這裡,教主的正上方每100公尺處就有乙個能量球 也就是這些能量球位於海拔 100,200,...

教主的花園

lhx教主最近總困擾於前來膜拜他的人太多了,所以他給他的花園加上了一道屏障。可以把教主的花園附近區域抽像成乙個正方形網格組成的網路,每個網格都對應了乙個座標 均為整數,有可能為負 若兩個網格 x1,y1 x2,y2 有 x1 x2 y1 y2 1,則說這兩個網格是相鄰的,否則不是相鄰的。教主在y 0...