3 条题解
-
0
大暴力模拟法
把这个三角形旋转45度,可以得到以下类似的三角
1 3 2 4 5 6 .....
接下来暴力枚举出这个三角形
vector<vector<i64>> vecs, ans; for (int i = 1, j = 1, k = 1; i <= 40; ++i, ++j) { vector<i64> arr; for (int x = 0; x < j; ++x) { arr.emplace_back(k++); } if (~i & 1) reverse(arr.begin(), arr.end()); vecs.emplace_back(arr); }
然后将斜线的元素转为直线储存的
for (int x = 0; x < 40; ++x) { vector<i64> arr; for (int i = 0; i < 40; ++i) { if (vecs[i].empty()) continue; arr.emplace_back(vecs[i].back()); vecs[i].pop_back(); } ans.emplace_back(arr); }
接下来直接查表即可
参考代码
#include <bits/stdc++.h> using namespace std; using i64 = long long; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); vector<vector<i64>> vecs, ans; for (int i = 1, j = 1, k = 1; i <= 40; ++i, ++j) { vector<i64> arr; for (int x = 0; x < j; ++x) { arr.emplace_back(k++); } if (~i & 1) reverse(arr.begin(), arr.end()); vecs.emplace_back(arr); } for (int x = 0; x < 40; ++x) { vector<i64> arr; for (int i = 0; i < 40; ++i) { if (vecs[i].empty()) continue; arr.emplace_back(vecs[i].back()); vecs[i].pop_back(); } ans.emplace_back(arr); } cout << ans[19][19]; return 0; }
-
0
【2020年省赛B组】试题C: 蛇形填数
题解
规律题。
定义,表示当前位置所在行,c表示当前位置所在列,ans 记录当前位置的数值。 那么下一个位置将会有以下六种情况:
- ,c为奇数:那么下一步将会到达的位置为()。
- ,c为偶数:那么下一步将会到达的位置为()。
- ,r为偶数,那么下一步将会到达的位置为()。
- ,r为奇数且,那么下一步将会到达的位置为()。
- ,,为奇数,那么下一步将会到达的位置为()。
- ,,为偶数,那么下一步将会到达的位置为()。
按照这 6 种情况模拟,每走一步 ans 就加 1,直到 r = 20,c= 20 时结束模拟输出 ans。
最后的答案为
761
。
提交代码
#include<bits/stdc++.h> using namespace std; signed main() { int r = 1 , c = 1 , ans = 1; while(r != 20 || c != 20){ if(r == 1){ if(c & 1) c ++ ; else r ++ , c --; } else if(c == 1){ if(r % 2 == 0) r ++; else r -- , c ++; } else if((r + c) % 2) r ++ , c -- ; else r -- , c ++ ; ans ++ ; } cout << ans << '\n'; return 0; }
- 1
信息
- ID
- 998
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 85
- 已通过
- 40
- 上传者