hihocoder-1565-大富翁
#1565 : 大富翁
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi在玩大富翁游戏。游戏棋盘由一排 N 个格子组成,其中第 i 个格子上有一个正整数 Ai,表示如果玩家当前回合在第 i 个格子,那么下一回合他将移动到第 i+Ai 个格子上(如果 i+Ai>N,则该玩家本局游戏结束)。每局游戏开始前,某些格子上的数字可能发生改变。
当一局游戏开始时,小Hi通过掷骰子决定自己的初始位置。每当小Hi处于一个格子时(包含初始位置的格子),他都有一次机会可以购买房产。小Hi想知道如果这一局他起始位置是 Y,那么本局中他能够有几次购买房产的机会。
输入
第一行一个正整数 N。
第二行 N 个正整数,A1, A2, ... AN。
第三行一个正整数 Q,表示有 Q 次询问。
接下来 Q 行,每行首先有一个正整数 X。
若 X=1,则会再输入一个正整数 Y,你需要输出起始位置在第 Y 个格子时本局有几次购买房产的机会。
若 X=2,则会再输入两个正整数 u,v,表示将第 u 个格子上的值 Au 修改为 v。
对于30%的数据,6 ≤ N ≤ 10000, 1 ≤ Ai, v ≤ 10000, 1 ≤ Q ≤ 10000
对于100%的数据,6 ≤ N ≤ 100000, 1 ≤ Ai, v ≤ 100000, 1 ≤ Q ≤ 100000, 1 ≤ u ≤ N, 1 ≤ Y ≤ 6
输出
对于每个 X=1 的询问输出一行,包含一个正整数,表示小Hi在这一轮中能够有几次购买房产的机会。
- 样例输入
-
8 1 1 2 1 2 2 2 3 3 1 3 2 6 4 1 6
- 样例输出
-
3 1
使用暴力直接解决。
#include <cstdio> #include <iostream> using namespace std; const int MAXN = 100000 + 10; int n, q, A[MAXN], ans[MAXN]; int main(){ freopen("in.txt", "r", stdin); int op, x, y; scanf("%d", &n); for(int i=1; i<=n; ++i){ scanf("%d", &A[i]); } for(int i=1; i<=6; ++i){ ans[i] = -1; } scanf("%d", &q); for(int i=0; i<q; ++i){ scanf("%d", &op); if(op == 1){ scanf("%d", &x); if(ans[x] == -1){ int st = x; ans[x] = 0; while(st <= n){ ans[x]++; st += A[st]; } } printf("%d ", ans[x] ); }else{ scanf("%d %d", &x, &y); A[x] = y; for(int i=1; i<=6; ++i){ ans[i] = -1; } } } return 0; }