Files
python/TangDou/CSP-J/AcWingTraining/T4/450.cpp

68 lines
2.0 KiB
C++
Raw Normal View History

2025-08-30 18:35:01 +08:00
#include <bits/stdc++.h>
using namespace std;
// 常量定义
const int N = 10010; // 最大楼层数
const int M = 110; // 每层最大房间数
const int mod = 20123; // 取模基数
// 全局变量
int n, m; // n:楼层数(不含顶层), m:每层房间数
int k; // 当前所在房间号
int a[N][M]; // a[i][j]:第i层j号房间是否有楼梯(0/1)
int b[N]; // b[i]:第i层有楼梯的房间总数
int num[N][M]; // num[i][j]:第i层j号房间的指示牌数字
/**
* 主函数:模拟寻宝过程,计算密钥
* 算法思路:
* 1. 读取输入数据,统计每层有楼梯的房间数
* 2. 从初始房间开始,逐层向上
* 3. 每层根据指示牌数字计算要走的步数
* 4. 模拟行走过程,找到上楼房间
* 5. 累加指示牌数字作为密钥
*/
int main() {
// 读取楼层和房间数
cin >> n >> m;
int res = 0; // 密钥结果
// 读取每层每个房间的数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j] >> num[i][j];
b[i] += a[i][j]; // 统计本层有楼梯的房间数
}
}
// 读取初始房间号
cin >> k;
/*
t t t
*/
// 逐层处理
for (int i = 0; i < n; i++) {
// 累加当前房间的指示牌数字(模20123)
int t = num[i][k];
res = (res + t) % mod;
// 计算实际需要走的步数
t %= b[i]; // 取模避免重复绕圈
if (!t) t = b[i];// 处理模0的情况
// 模拟行走过程
int sum = 0; // 已走的有效步数
while (sum < t) {
sum += a[i][k]; // 只有有楼梯的房间才算一步
if (sum == t) break; // 达到目标步数
// 移动到下一个房间(环形处理)
k = (k + 1) % m;
}
}
// 输出结果
printf("%d\n", res);
return 0;
}