洛谷P1076 尋寶

題目描述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;
}
相關文章
相關標籤/搜索