Codeforces Round 956 (Div. 2) 部分题解A~C

A. Array Divisibility

题目大意

构造长度为n的数组,满足:

  • 所有j的aj之和可以被k整除,其中j是k的倍数,k的取值为1~n。

思路

构造序列1->n即可满足条件。

代码实现
void solve() {
    ll n; cin >> n;
    for (int i = 1; i <= n; i++)cout << i << " ";
    cout << "\n";
}

B. Corner Twist

题目大意

给定a和b两个网格,网格中只存在0、1、2三种值。

给定操作,可以选择一个矩形的一条对角线上的两个端点,让他们加1/2;另一条对角线的端点值加2/1,然后对这些值取模3。问是否存在操作可以让a和b两个网格一致。

思路

考虑网格的边上的值,边上的值的变化会受到其他的影响,所以我们优先去找如何让边上的值相等即可。

正扫一遍,反扫一遍,然后比较数组即可。

代码实现
void solve() {
    ll n, m; cin >> n >> m;
    vector>a(n + 1, vector(m + 1));
    vector>b(n + 1, vector(m + 1));
    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];
    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> b[i][j];
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; j++) {
            if (a[i][j] != b[i][j]) {
                if (a[i][j] == '0') {
                    if (b[i][j] == '1') {
                        a[i][j] += 1;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 1;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 2;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 2;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }else if(b[i][j]=='2') {
                        a[i][j] += 2;
                        if (a[i][j] == '3')a[i][j] = '0';
                        if (a[i][j] == '4')a[i][j] = '1';
 
                        a[i + 1][j + 1] += 2;
                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
 
                        a[i + 1][j] += 1;
                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
 
                        a[i][j + 1] += 1;
                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
                    }
                }
                else if (a[i][j] == '1') {
                    if (b[i][j] == '2'

你可能感兴趣的:(算法,数据结构,c++)