Codeforces 55 题目分析
本文将对 Codeforces 55 (Beta Round 51) 进行分析。
A
题目描述:
一个虫子位于绕城一圈的 \(n\) 片树叶中的一片上,在第 \(k\) 分钟,虫子会跳过 \(k−1\) 片树叶并在脚下的树叶上做一个记号。你的任务是判断该虫子是否将 \(n\) 片树叶都做了记号。
解题思路:
直接模拟即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, cnt = 0;
bool vis[1010];
const int inf = 1000000;
int main() {
cin >> n;
int pos = 0;
for (int i = 1; i <= inf; i++) {
if (!vis[pos]) cnt++;
vis[pos] = 1;
pos = (pos + i - 1) % n;
}
puts((cnt == n) ? "YES" : "NO");
return 0;
}
B
题目描述:
现有 \(4\) 个整数(均小于等于 \(1000\)),并给出三个运算符(均为
+
或*
)。要求每次取出不一定相邻的两个数,并依次使用给出的运算符对这两个数进行运算,并将结果当做一个新数如此操作,直到只剩下一个数为止。 编程求出最后剩下数的最小值。
解题思路:
暴搜求最小值。复杂度能过。
代码略。
C
题目描述:
Volodya 和 Vlad 在下一盘棋,在棋盘的 \(n \times m\)(\(1 \le n,m \le 100\)) 格中有 \(k\) (\(0 \le k \le 100\)) 个棋子。
每轮 Volodya 将一个棋子移动到相邻的单元格中。如果棋子位于棋盘边界,Volodya 可以将其移出棋盘并获胜。在Volodya 移动之后,Vlad 会在棋盘边界上放上长度为 \(1\) 的挡板(图中黑线),这样下一轮中 Volodya 就不能再通过这条边线将棋子移到棋盘外了。
问:Volodya 会赢得这盘棋吗?我们假设两位棋手都采用了最优策略。
解题思路:
注意到,如果棋子在边上,则需要将挡板放在靠近边缘的位置。
此时,棋子可以侧向移动,挡边也可以一直挡。直到棋子到达角落。此时由于存在两条相邻的边,所以不管堵那条,棋子都能从另一条出去。于是考虑在棋子移动到边缘的过程中,先将四个角堵上。
即得:判断棋子到边缘的距离。大于 \(4\) 则必然失败。
代码略。
D
题目描述:
Volodya 认为一个数字 x 是美丽的,当且仅当对于 x 的每一个非零位上的数 y,都有 \(y∣x\)。
你需要帮助他算出在区间 \([l,r]\) 中有多少个数是美丽的。
解题思路:一眼数位 DP。然后就不会做了。
由于数字除以 lcm 不改变整除特性,因此将所有数字整除 lcm(\(1, ..., 9\))。
然后考虑离散化质因数防止 MLE。记得开 long long。
以上纯口胡。
E
题目描述:
给定一个凸多边形和一些点,问你这些点被多少个三角形所包含。
解题思路:
用总数减去不包含的数量。同一平面内任选三个点的方案数为 \(C^n_3\),然后观察发现若一个点不在三角形内,则该三角形的一条边分隔该点与不为这条边的顶点的三角形顶点。于是可切。
也是纯口胡。