Codeforces Round 930 (Div. 2)

Codeforces Round 930 (Div. 2) (A~B)-CSDN博客

比赛:Codeforces Round 930 (Div. 2)

目录:A B

A题:Shuffle Party

标签: 模拟

题目大意

  • 给你一个数组 a1,a2,…,an。最初,每个 1 ≤ i ≤ n都有 ai=i,整数 k ≥ 2的运算 swap(k)定义如下:
    • 设 d是不等于 k本身的最大除数 。然后交换元素 ad 和 ak
  • 执行swap(2) swap(3) …. swap(n):问执行完后1在哪个位置

思路

  • 只关注1的交换位置,2的最大除数是1,4的最大除数是2,8的最大除数是4….
  • 所以1的位置会有1 -> 2 -> 4 -> 8 -> 16 … 一直到接近n的位置

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n; cin >> n;
int t = log2(n); // 找到满足 2^t <= n 最大的t
cout << (1 << t) << endl; // 2^t即为答案
}
int main()
{
int T; cin >> T;
while(T--)
solve();
return 0;
}

B题:Binary Path

标签: 实现问题,编程技巧,模拟(implementation)

题目大意

  • 给你一个 2×n 充满了 0 和 1的 网格。 i 行和j列的数字是 aij
  • 从(1, 1)点开始只能向下或向右走,走到(2, n),经过路径上的数字拼接起来。
  • 问:拼接后的数字 字典序最小的是什么,有几种走法能得到这个字典序最小值。

思路

  • 因为是2 * n的网格只能向下或向右走,所以只能向下走一次,走完一次向下后路线固定了因为只能向右走了
  • 为了好说明,这里将那个向下走的位置称为断点
  • 将1 ~ n 每一个点当作断点枚举,要字典序最小所以要走法有以下几种情况:
    1. 如果当前点右边点小于下边点那么一定向右走,继续向后寻找断点
    1. 下面的点小于右边的点,那么向下走。那么这个点就是断点,并且只有这一种情况
    1. 下面的点等于右边的点,这时既可以向下又可以向右,但如果在之后遇到下面的点不等于右边的点得情况那么路线会被确定到后面得点,没有则当前点和右边点都可以作为断点
  • 样例3 断点可为0011,即从0011往下字典序最小且一样,如下:
  • 001 0011 1
    111 011 01

AC代码

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
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
vector<string> v;
void solve()
{
int n; cin >> n;
v.clear();
for(int i = 0; i < 2; i++)
{
string s; cin >> s;
v.push_back(s);
}
int res = 1, idx = 0;
for(int i = 0; i < n-1; i++)
{
if(v[0][i+1] == v[1][i])
res ++;
else {
// 下面的点小于右边的点,那么向下走,那么这个点就是断点
if(v[0][i+1] > v[1][i]) {
idx = i;
break;
}
// 如果当前点右边点小于下边点那么一定向右走,那么当前点不是断点,继续向后寻找断点
idx = i + 1;
res = 1; // 上一步是向右走,路线时固定的刷新为一种情况
}
}
// 断点为idx输出路径
for(int i = 0; i <= idx; i++)
cout << v[0][i];
for(int i = idx; i < n; i++)
cout << v[1][i];
cout << "\n" << res << "\n";
}
int main()
{
int T; cin >> T;
while(T--)
solve();
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
//へ     /|
//  /\7    ∠_/
//  / │   / /
// │ Z _,< /   /`ヽ
// │     ヽ   /  〉
//  Y     `  /  /
// イ● 、 ●  ⊂⊃〈  /
// ()  へ    | \〈
//  >ー 、_  ィ  │ //
//  / へ   / ノ<| \\
//  ヽ_ノ  (_/  │//
//   7       |/
//
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
__ _,--="=--,_ __
/ \." .-. "./ \
/ ,/ _ : : _ \/` \
\ `| /o\ :_: /o\ |\__/
`-'| :="~` _ `~"=: |
\` (_) `/
.-"-. \ | / .-"-.
.---{ }--| /,.-'-.,\ |--{ }---.
) (_)_)_) \_/`~-===-~`\_/ (_(_(_) (
( )
) (
'---------------------------------------'
*/

Codeforces Round 930 (Div. 2)
https://leaf-domain.gitee.io/2024/03/01/cf-div2-930/
作者
叶域
发布于
2024年3月1日
许可协议