'commit'
This commit is contained in:
68
TangDou/CSP-J/AcWingTraining/T4/450.cpp
Normal file
68
TangDou/CSP-J/AcWingTraining/T4/450.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user