题解:P1076 [NOIP2012 普及组] 寻宝

· · 题解

题意

告诉你每层的房间数,依靠指示牌的数字找到上一层的房间即可

思路

只要一层一层的模拟每个房间即可,我们从 j 号屋爬到的一定是下一层的 j 号屋。我们用变量 pos 来存储位置。 但是暴力肯定会超时,因为数据很大,所以我们发现了周期,用找的次数模楼层门数即可,但是如果号码为该层楼梯门个数,也就是余数为零,为保证正确性,加一再模即可,建议使用 scanf 呦,超时了别怪我

代码

#include <bits/stdc++.h>
using namespace std;
const int size=20123;
long long al = 0;
int k;
int s[10001][101], a[10001][101];
int n, m;
int main() {
    cin >> n >> m;
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d%d", &s[i][j], &a[i][j]);
            if (s[i][j] == 1) {
                sum++;
            }
        }
    }
    cin >> k;
    for (int i = 1; i <= n; i++) {
        int x = a[i][k];
        al = (al + x) % size;
        int t = 0;
        for (int j = 0; j < m; j++) {
            t += s[i][j];
        }
        x %= t;
        if (x == 0) {
            x = t;
        }
        if (s[i][k]) {
            x--;
        }
        while (x) {
            k = (k + 1) % m;
            if (s[i][k]) {
                x--;
            }
        }
    }
    cout << al % size;
    return 0;
}

如有任何问题请在评论区@我,管理大大求过!