1 条题解
-
4
题解
这道题是一道模拟,直接模拟上楼过程即可。但是这里要有一个优化:。
观察一下就能发现,在寻找第 个有楼梯的房间时,一定是绕了这一层不知道几圈了。所以我们自然而然想到了取模。
我们与处理一下某一层有多少有楼梯的房间,到时候模一下,然后再模拟。
这样说可能有点不太清楚,我们结合代码片段说一下:
// 输入部分 scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 0; j < m; j++) { // 输入是否有楼梯和x scanf("%d%d", &stair[i][j], &x[i][j]); if (stair[i][j]) // 有楼梯 cnt[i]++; // 这一层楼梯数++ // 通过这样来统计每一层的楼梯数量 } scanf("%d", &s);
// 模拟时取模减小循环和计算答案部分 ans = (x[i][s] + ans) % 20123; // 计算答案,注意这里不能取模 int t = x[i][s] % cnt[i]; // 这里t是真实数的次数
大概能理解了吧。
不!接下整篇代码也就没什么大的思路了,注意一下细节。
#include <bits/stdc++.h> using namespace std; int N, M, s, ans = 0; // s: 当前位置 bool stair[10005][105]; // 房间是否有楼梯 int cnt[10005], x[10005][105]; // 房间有楼梯房间数量和房间里的x int main() { scanf("%d%d", &N, &M); for (int i = 1; i <= N; i++) for (int j = 0; j < M; j++) { scanf("%d%d", &stair[i][j], &x[i][j]); if (stair[i][j]) // 统计每一层的楼梯房间数量 cnt[i]++; } scanf("%d", &s); // 从s进入 for (int i = 1; i <= N; i++) { ans = (x[i][s] + ans) % 20123; // 统计答案 int t = x[i][s] % cnt[i]; // 这里用于节省多余循环 if (t == 0) // 特判取模模成0了(其实表示要绕整圈) t = cnt[i]; if (stair[i][s]) // 这里特判本房间是否有楼梯,就-- t--; // 注意这两个特判不能调换,因为如果两个特判都满足了,t = 0,t--变成-1就无法识别,错误了 while (t != 0) // 模拟数房间 { s++; // 向后走一个 if (s == M) s = 0; // 到达最后一个归0 if (stair[i][s]) t--; // 有楼梯数量-- } // 其实这里上楼了,就直接上到i++了,而且s正好也代表现在房间 } printf("%d\n", ans); return 0; }
#include <bits/stdc++.h> using namespace std; int N, M, s, ans = 0; bool stair[10005][105]; int cnt[10005], x[10005][105]; int main() { scanf("%d%d", &N, &M); for (int i = 1; i <= N; i++) for (int j = 0; j < M; j++) { scanf("%d%d", &stair[i][j], &x[i][j]); if (stair[i][j]) cnt[i]++; } scanf("%d", &s); for (int i = 1; i <= N; i++) { ans = (x[i][s] + ans) % 20123; int t = x[i][s] % cnt[i]; if (t == 0) t = cnt[i]; if (stair[i][s]) t--; while (t != 0) { s++; if (s == M) s = 0; if (stair[i][s]) t--; } } printf("%d\n", ans); return 0; }
- 1
信息
- ID
- 1496
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 85
- 已通过
- 51
- 上传者