輸入的第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...