hihocoder-1565-大富翁

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,则会再输入两个正整数 uv,表示将第 u 个格子上的值 Au 修改为 v

对于30%的数据,6 ≤ N ≤ 10000, 1 ≤ Aiv ≤ 10000, 1 ≤ Q ≤ 10000

对于100%的数据,6 ≤ N ≤ 100000, 1 ≤ Aiv ≤ 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; 
} 

  

原文地址:https://www.cnblogs.com/zhang-yd/p/7440993.html