題目描述c++
傳說很遙遠的藏寶樓頂層藏着誘人的寶藏。小明歷盡千辛萬苦終於找到傳說中的這個藏寶樓,藏寶樓的門口豎着一個木板,上面寫有幾個大字:尋寶說明書。說明書的內容以下:字體
藏寶樓共有N+1層,最上面一層是頂層,頂層有一個房間裏面藏着寶藏。除了頂層外,藏寶樓另0有N層,每層M個房間,這M個房間圍成一圈並按逆時針方向依次編號爲0——M−1。其中一些房間有通往上一層的樓梯,每層樓的樓梯設計可能不一樣。每一個房間裏有一個指示牌,指示牌上有一個數字x,表示從這個房間開始按逆時針方向選擇第x個有樓梯的房間(假定該房間的編號爲k),從該房間上樓,上樓後到達上一層的kkk號房間。好比當前房間的指示牌上寫着2,則按逆時針方向開始嘗試,找到第2個有樓梯的房間,從該房間上樓。若是當前房間自己就有樓梯通向上層,該房間做爲第一個有樓梯的房間。spa
尋寶說明書的最後用紅色大號字體寫着:「尋寶須知:幫助你找到每層上樓房間的指示牌上的數字(即每層第一個進入的房間內指示牌上的數字)總和爲打開寶箱的密鑰」。設計
請幫助小明算出這個打開寶箱的密鑰。
輸入輸出格式
輸入格式:code
第一行2個整數N和M,之間用一個空格隔開。N表示除了頂層外藏寶樓共N層樓,M表示除頂層外每層樓有M個房間。ci
接下來N×M行,每行兩個整數,之間用一個空格隔開,每行描述一個房間內的狀況,其中第(i−1)×M+j(i-1)行表示第i層j−1號房間的狀況(i=1,2,…,Ni=1,2,…,Ni=1,2,…,N;j=1,2,…,Mj=1,2,…,Mj=1,2,…,M)。第一個整數表示該房間是否有樓梯通往上一層(0表示沒有,1表示有),第二個整數表示指示牌上的數字。注意,從j號房間的樓梯爬到上一層到達的房間必定也是j號房間。it
最後一行,一個整數,表示小明從藏寶樓底層的幾號房間進入開始尋寶(注:房間編號從0開始)。循環
輸出格式:統計
一個整數,表示打開寶箱的密鑰,這個數可能會很大,請輸出對20123取模的結果便可。數據
輸入輸出樣例
輸入樣例#1:
2 3
1 2
0 3
1 4
0 1
1 5
1 2
1
輸出樣例#1
5
說明
【數據範圍】
對於50%數據,有0<N≤1000,0<x≤100000
對於100%數據,有有0<N≤10000,0<M≤100,0<x≤1,000,0000
NOIP 2012 普及組 第二題
這道題的整體思想是模擬。開一個數,循環找一個房間的門。到達一個門就統計一下。不斷累積門的個數,有門爲1,不然是0,sum[i]統計個數。由於題目中說了頂層除外,就不用i<=n,直接用i<n做爲結束條件。i++模擬上樓。還要判斷是否是一個環
#include<bits/stdc++.h> using namespace std; int sum=0; int n,m; int a[10100][1010],b[10010][1010]; int c[100100]; int tre; int main(){ cin >> n >> m; for(int i=1;i<=n;i++)//讀入 for(int j=0;j<m;j++){ cin >> a[i][j] >> b[i][j]; if(a[i][j]==1){ c[i]++;//統計門數 } } cin >> tre; int ans=b[1][tre]; int j=tre; int i=1;//預處理 while(i<n){//while循環結束條件 int x,y=false; x=b[i][j]%c[i]; if (x==0){ x=c[i]; } while(y+a[i][j]<x){//模擬題意 y=y+a[i][j]; j++; if(j==m){ j=0; } } i++;有樓梯,上樓 ans=ans+b[i][j];//加上指示牌數字 ans%=20123;//邊走邊模 } cout << ans%20123; return 0; }