「题解」Codeforces Round 993 (Div.4)

周日偶遇 Div.4,被神秘 D 题卡到断电,拼尽全力勉强战胜,共 A 出 5 题遗憾下机。

link

A

给 Cube 一个整数 $n$ 。她想知道有多少对有序的正整数 $(a,b)$ 能使 $a=n-b$ 成对。由于 Cube 不擅长数学,请帮助她!

考虑到数据范围较小($2\le n \le 100$),暴力枚举即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void solve() {
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 1; i <= 1000; i ++) {
        for (int j = 1; j <= 1000; j ++) {
            if (i + j == n)
                ans ++;
        }
    }
    cout << ans << "\n";
    
}

以上是为了拼手速尽快 A 题想出来的神秘解法,稍微分析一下就可以知道答案是 $n - 1$。

B

一家商店的玻璃橱窗上画着一串只有字符 “p”、“q “和 “w “的字符串。Ship 走过商店,站在玻璃橱窗正前方,观察到字符串 $a$ 。然后,小船走进商店,直视同一玻璃橱窗,观察到字符串 $b$ 。

飞船给出字符串 $a$ 。您的任务是找到并输出 $b$ 。

考虑到镜像的特点,倒序输出的同时把 pq 互换即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
void solve() {
    string s;
    string t = "";
    cin >> s;
    int ans = 0;
    for (int i = s.length() - 1; i >= 0; i --) {
        if (s[i] == 'p')
            t += 'q';
        if (s[i] == 'q')
            t += 'p';
        if (s[i] == 'w')
            t += s[i];
    }
    cout << t << "\n";
    
}

C

波尔是纸折大学的老师。他教室里的座位排成 $2$ 行,每行有 $m$ 个座位。

波尔正在给 $a + b + c$ 只猴子上课,他想给尽可能多的猴子分配座位。波尔知道 $a$ 只想坐在第 $1$ 排, $b$ 只想坐在第 $2$ 排, $c$ 没有任何偏好。每个座位只能坐一只猴子,而且每只猴子都必须按照自己的偏好入座。

波尔最多可以让多少只猴子坐下?

小学数学。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
void solve() {
    int m, a, b, c;
    cin >> m >> a >> b >> c;
    int ans = 0;
    if (a <= m) {
        ans += a;
    } else {
        ans += m;
    }
    if (b <= m) {
        ans += b;
    } else {
        ans += m;
    }
    if (ans <= 2 * m) {
        if (c) {
            ans = min(2 * m, ans + c);
        }
    }
    cout << ans << "\n";
}

D

给定一个正整数序列,如果一个正整数出现的次数是任何一个正整数出现的最大次数,那么这个正整数就称为序列的模。例如, $[2,2,3]$ 的模是 $2$ 。 $9$ 、 $8$ 或 $7$ 中的任何一个都可视为序列 $[9,9,8,8,7,7]$ 的模。

你给了 UFO 一个长度为 $n$ 的数组 $a$ 。为了感谢你,UFO 决定再构造一个长度为 $n$ 的数组 $b$ ,使得 $a_i$ 是数列 $[b_1, b_2, \ldots, b_i]$ 中所有 $1 \leq i \leq n$ 的模式。

然而,UFO 不知道如何构造数组 $b$ ,所以你必须帮助她。请注意,在所有 $1 \leq i \leq n$ 中,你的数组 $1 \leq b_i \leq n$ 必须成立。

考虑到 $1\le a_i\le n$ 且 $1\le b_i\le n$,因此本题可以看作一个排列问题。在此基础上,我们可以发现 $1 \ldots n$ 的排列的众数是其本身(即每个数都只出现一次)。因此我们只需要根据 $a_i$ 调整 $b_i$ 的顺序即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> f(n + 1);
    for (int &v : a) {
    vector<int> f(n + 1);
    for (int &v : a) {
        cin >> v;
    }
    vector<int> b(n);
    for (int i = 0; i < n; i ++) {
        if (!f[a[i]]) {
            f[a[i]] ++;
            b[i] = a[i];
        }
    }
    int p = 0;
    for (int i = 0; i < n; i ++) {
        if (b[i] == 0) {
            for (int j = p + 1; j <= n; j ++) {
                if (f[j] == 0) {
                    p = j;
                    break;
                }
            }
            b[i] = p;

        }
        cout << b[i] << " ";
    }
    cout << "\n";
}

E

小波得到五个整数 $k$ , $l_1$ , $r_1$ , $l_2$ 和 $r_2$ 。小波希望你帮她计算出满足以下所有条件的有序数对 $(x, y)$ 的个数:

  • $l_1 \leq x \leq r_1$ .
  • $l_2 \leq y \leq r_2$ .
  • 存在一个非负整数 $n$ ,使得 $\frac{y}{x} = k^n$ .

提前计算好 $k^n$,约束 $x$ 的范围枚举即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void solve() {
    int k, l1, r1, l2, r2;
    cin >> k >> l1 >> r1 >> l2 >> r2;
    int ans = 0;
    vector<int> kn;

    int tmp = 1;
    while (tmp <= r2) {
        kn.push_back(tmp);
        if (tmp > r2 / k) break; 
        tmp *= k;
    }

    for (int power : kn) {
        int x_min = max((l2 + power - 1) / power, l1); 
        int x_max = min(r2 / power, r1); 

        if (x_min <= x_max) {
            ans += (x_max - x_min + 1); 
        }
    }
    cout << ans << "\n";
}
赣ICP备2024042422号
使用 Hugo 构建
主题 StackJimmy 设计