LGR-213 洛谷入门赛 #31 题解(To be updated)
A 数字谜
前置芝士:表达式,位值原理,顺序结构,加减运算,(分支结构)
明显,个位以后的数都是没有必要的,因为我们只需要知道个位数字是几就可以得出答案。
知道
我们并不知道
其中 (b - p + 10) % 10。为什么呢?
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
int p = a % 10;
int ans = (b - p + 10) % 10;
cout << ans << endl;
return 0;
}
B 会场座位
前置芝士:数组,遍历,等差数列,循环结构,间隔问题
可以明显看出来以
把座位号存储在数组
可我们都不知道这两个数列的项数,很简单,等差数列项数公式就是首项减末项的差除以公差再加一的和。简而言之,就是
算出来两个等差数列的项数都是
用两个 for 循环存储即可。当然,也有用一个 for 循环就可以存储的方法,将在代码中给出。
然后找到两个座位号的下表
错!两个座位号的位置可能是
实际上,可以用 STL 中的 find 函数来找这个位置的下标。但对于入门赛来说,这不值得。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> n(100);
int main()
{
for (int i = 0; i < 50; ++i)
{
n[i] = 99 - 2 * i;
n[50 + i] = 2 * i;
}
int a, b;
cin >> a >> b;
int pos_a = find(n.begin(), n.end(), a) - n.begin();
// 这里的 find 函数涉及到了数组的迭代器的偏移量,将在后面的二分也会学习到同样的做法。
int pos_b = find(n.begin(), n.end(), b) - n.begin();
int gap = abs(pos_a - pos_b) - 1;
cout << gap << endl;
return 0;
}
其中 abs 函数是求绝对值,在 algorithm 头文件可以找到。
find 函数等价于:
for (int i = 1; i <= 100; i++)
{
if (a == n[i]) pos_a = i;
if (b == n[i]) pos_b = i;
}
C Pollard-Rho
前置芝士:表达式,循环结构
只需要在每一次开锁后改密码即可。
但是!但是!但是!
第一次开门的密码是原始密码,开门以后才改密码,第二次开门的密码是修改一次的密码。
简而言之,第
for 循环,注意循环结束的条件是
#include <iostream>
using namespace std;
int main()
{
int x1, C, k;
cin >> x1 >> C >> k;
int x = x1;
for (int i = 1; i < k; ++i) x = (x * x + C) % 10000;
cout << x << endl;
return 0;
}
D 检票
前置芝士:分支结构,数组
这
开一个数组存储原来的队列,遍历寻找小于等于
#include <iostream>
#include <vector>
using namespace std;
vector<int> t;
vector<int> u, nu;
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; ++i) cin >> t[i];
for (int i = 0; i < n; ++i)
{
if (t[i] <= 15) u.push_back(t[i]);
else nu.push_back(t[i]);
}
for (int i = 0; i < u.size(); ++i) cout << u[i] << " ";
for (int i = 0; i < nu.size(); ++i) cout << nu[i] << " ";
return 0;
}
E 右箭头
前置芝士:数学归纳,循环结构,轴对称,数组
倒数第二个 A 的。
可能我的做法并不是最优解,但可以参考。
注意到
......#...
......##..
#########. Part 1
########## Part 2
#########.
......##..
......#... Part 3
当然,样例
Part 2 就是长为
首先,Part 1 可以继续细分为:
......#...
......##.. Part 1.1
#########. Part 1.2
而 Part 1.1 也可以继续细分为:
...... #...
...... ##..
Part 1.1.1 Part 1.1.2
Part 1.1.1 只需要把整个 Part 1 数组全部设为 . 即可。
Part 1.1.2 明显就是一个直角三角形。但是我们不知道的东西太多了。
首先,Part 1.1.2 在 Part 1 数组的位置在哪里?
这就和箭头的直角三角形的斜边的高有关系了。
样例