AtCoder Beginner Contest 055
A
一餐 \(800\) 元,每吃 \(15\) 餐会退回 \(200\) 元。询问吃 \(x\) 餐总共需要花费多少元?
\(-\lfloor \frac{x}{15} \rfloor \times 200 + 800 x\) 。
B
题意:
史努克喜欢锻炼。他已经锻炼 \(N\) 次。锻炼之前,他的力量是 \(1\) 。在他第 \(i\) 次锻炼之后,他的力量将会乘以 \(i\) 。回答他现在有多少力量。
结果 \(\bmod 10^{9} + 7\)
\(1 \leq N \leq 10^{5}\)
题解:
线性做法可以递推。
任意模 NTT 和拉格朗日插值可以做到 \(\sqrt{N} + \log N\) 。
C
题意:
史努克喜欢谜题。
现在他在玩一个基于 s 和 c 的谜题。他可以按照下面的方式,用两个 c 得到一个 s 。

询问给 N 个 s 和 M 个 c ,他能得到多少个 scc 组合。
\(1 \leq N, M \leq 10^{12}\)
题解:
若 \(N \geq \lfloor \frac{2}{M} \rfloor\) ,答案只依赖于 c 和 s 配对的数量。答案是 \(\lfloor \frac{M}{2} \rfloor\) 。
否则,c 和 s 完成配对后,每 4 张可以得到一组 scc 。答案是 $N + \lfloor \frac{(M - 2 * N)}{4} \rfloor $ 。
ll N, M; std::cin >> N >> M;
if (N >= M / 2) std::cout << M / 2 << "\n";
else std::cout << N + (M - 2 * N) / 4 << "\n";
D
题意:
\(N\) 只动物排成一个环,编号为 \(1 \sim N\) 。
这些动物只有狼和羊。羊只会说真话,狼只会说假话。
史努克对每个动物都询问“你的邻居种类一样吗?”。从 \(1\) 开始问到 \(N\) ,得到一个字符串 \(s\) ,X 表示不愿意,O 表示一样。
按 \(1 \sim N\) 的编号给出任意一种可能的动物排列。羊为 S ,狼为 W 。
不存在任意一种排列则输出 \(-1\) 。
\(3 \leq N \leq 10^{5}\)
题解:
在所有可能的方案中。如果第 \(1, 2\) 只动物固定,所有动物都可以被固定。
只要枚举 \(2 \sim N - 1\) 的动物的回答就能确定编号为 \(1 \sim N\) 的动物。
然后 check \(1\) 和 \(N\) 编号动物的回答是否符合这个答案。
时间复杂度 \(O(N)\) 。
有一个动物园,有羊和狼两种动物。羊只会说真话,狼只会说假话。现在动物们围城一圈,从第 \(1\) 个动物开始逐个问问题。问题为:你的邻居的种类是否一样?若 \(o\) 则表示肯定, \(x\) 表示否定。动物的回答以字符串形式给出。
现给定字符串长度,并给出字符串表示动物的回答,需要你判断这个字符串是否能对应一种动物的排列?如果能,输出能以一种动物排列, \(S\) 表示羊, \(W\) 表示狼。否则输出 \(-1\) 。
int n; std::cin >> n;
std::string s; std::cin >> s; s = ' ' + s;
std::vector<int> guess(n + 1);
for (int i = 0; i <= 1; i++) {
for (int j = 0; j <= 1; j++) {
guess[1] = i;
guess[2] = j;
for (int k = 2; k < n; k++) {
if (s[k] == 'o' && guess[k] == 0) guess[k + 1] = guess[k - 1];
else if (s[k] == 'o' && guess[k] == 1) guess[k + 1] = guess[k - 1] ^ 1;
else if (s[k] == 'x' && guess[k] == 0) guess[k + 1] = guess[k - 1] ^ 1;
else if (s[k] == 'x' && guess[k] == 1) guess[k + 1] = guess[k - 1];
}
int ok = 1;
if (s[n] == 'o' && guess[n] == 0) ok &= guess[n - 1] == guess[1];
else if (s[n] == 'o' && guess[n] == 1) ok &= guess[n - 1] != guess[1];
else if (s[n] == 'x' && guess[n] == 0) ok &= guess[n - 1] != guess[1];
else if (s[n] == 'x' && guess[n] == 1) ok &= guess[n - 1] == guess[1];
if (s[1] == 'o' && guess[1] == 0) ok &= guess[n] == guess[2];
else if (s[1] == 'o' && guess[1] == 1) ok &= guess[n] != guess[2];
else if (s[1] == 'x' && guess[1] == 0) ok &= guess[n] != guess[2];
else if (s[1] == 'x' && guess[1] == 1) ok &= guess[n] == guess[2];
if (ok) {
for (int i = 1; i <= n; i++) std::cout << (guess[i] == 0 ? 'S' : 'W');
return;
}
}
}
std::cout << -1 << "\n";
浙公网安备 33010602011771号