天天看點

B. 【NOIP2012普及組真題】 尋寶

B. 【NOIP2012普及組真題】 尋寶

題解:

– 簡單的模拟題, 因為每層樓都是一個環,是以可以把需要找到第幾個房間對整層樓的有樓梯的房間數取模,然後在輸入時把所有有樓梯的房間儲存下來,用

lower_bound

直接查找,時間複雜度:O(nlogn)

– 具體原理請自行舉個栗子,絕對沒有錯的。

代碼:

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int MAXN=;

int n,m,now;
struct hehe{
    int shu[];
    int sum;
    int f[];
}Floor[MAXN];

long long ans;

int main(){
//  freopen("treasure.in","r",stdin);
//  freopen("treasure.out","w",stdout);
    cin>>n>>m;
    for(int i=;i<=n;i++)
        for(int j=;j<m;j++){
            int ti;
            scanf("%d%d",&ti,&Floor[i].shu[j]);
            if(ti){
                Floor[i].f[Floor[i].sum]=j;
                Floor[i].sum++;
            }
        }
    cin>>now;
    for(int i=;i<=n;i++){
        int step=Floor[i].shu[now];
        ans+=step;
        ans%=;
        step%=Floor[i].sum;
        int j=lower_bound(Floor[i].f,Floor[i].f+Floor[i].sum,now)-Floor[i].f;
        j+=step-;
        if(j>=Floor[i].sum)
            j-=Floor[i].sum;
        if(j<)
            j=Floor[i].sum-;
        now=Floor[i].f[j];
    }
    cout<<ans;
    return ;
}