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";
posted @ 2023-03-19 01:23  03Goose  阅读(29)  评论(0)    收藏  举报