Codeforces Round #742 (Div. 2)
阅读原文时间:2023年07月11日阅读:3

A. Domino Disaster

思路

按照题意模拟即可 如果是

对应关系为R --> R L --> L U --> D D --> U

AC_CODE

inline void solve() {
    int n; cin >> n;
    string s; cin >> s;
    string ans;
    ans.resize(n);
    for(int i = 0; i < n; i ++ ) {
        if(s[i] == 'U') ans[i] = 'D';
        else if(s[i] == 'D') ans[i] = 'U';
        else ans[i] = s[i];
    }
    cout << ans << endl;
}

B. MEXor Mixup

题目中MEX的意思是 数组中最小的没有出现过的自然数…(百度了十分钟才查出来,离谱…)

思路

题目给了数组中的MEXXOR (异或和) 分别是ab

因此我们可以知道 数组中一定不存在a并且\(\le a\)的自然数一定会出现

因此我们先预处理出所有的异或前缀和 令这个数字为x

那么我们现在已经有了a个数字,并且异或和为x 我们想要从x 变为b

有三种可能

  1. x=b 我们输出 a 即可
  2. x^b=a 因为a这个数字不能用,所以我们需要两个数字构造出a 因此输出a+2
  3. x^b!=a 我们直接在原数组的基础上添加一个x^b即可满足构造要求,因此输出a+1

AC_CODE

const int N = 3e5 + 10;
LL x[N];
inline void solve() {
    int a, b;
    cin >> a >> b;
    int res = 0;
    res = x[a - 1];
    if((res ^ b) == 0) cout << a << endl;
    else if((res ^ b) != a) cout << a + 1 << endl;
    else cout << a + 2 << endl;

}

signed main()
{
    for(int i = 1; i < N; i ++ ) x[i] = (x[i - 1] ^ i);
    int T = 1; cin >> T;
    while(T -- ) {
        solve();
    }

    return 0;
}

C. Carrying Conundrum

题意

Alice 在进行竖式加法的时候,每次进位都会多进一位,比如6+4=10 她会把1进位到百位从而得出100

给定一个数字n,求一共有多少个二元组通过上述计算等于n

思路

因为每次都会多进一位,即是进两位, 那么我们把一个数字的奇数位和偶数位分别拆开, 那么他们的进位就正常了

然后由乘法原理我们可以知道所有的数字的不同组合.

需要注意的是, 一个数字n可以由正常进位的两个数字组成,那么它的组成方法有n+1种,这里进位是正常的,所以我们只需要考虑一种特殊情况

就是两个数字的组合中分别有一个是0的情况,而且他们两个还放在一起了,由于两个每个组合改变顺序也是合法的,所以这种特殊情况有两次

因此最终的结果减去2即可

AC_CODE

inline void solve() {
    string a;
    cin >> a;
    int x = 0, y = 0;
    for(int i = 0; a[i]; i += 1)
        if(i & 1)
            x = x * 10 + (a[i] - '0');
        else
            y = y * 10 + (a[i] - '0');
    cout << (x + 1) * (y + 1) - 2 << endl;
}

D - Expression Evaluation Error

题意

给定一个k个数字的和n 求如何分配k个数字(正整数) 使得k个数字在十一进制下的和最大

思路

我们肯定是要使最高位最大,因此我们贪心的从大到小枚举\(10^i\) 如果当前的n比\(10^i\)大而且可以使后面的数字最少分到1

我们就把这一个数字赋值为\(10^i\), 然后枚举到第k-1个数字,最后一个数字就是n剩下的数字

AC_CODE

#define LL long long
LL a[20];
inline void solve() {
    int n, k; cin >> n >> k;
    vector<int> ans(k);
    for(int i = 0; i < k - 1; i ++ ) {
        for(int j = 9; ~j; j -- ) {
            if(n > a[j] && n - a[j] >= k - i - 1) {
                ans[i] = a[j];
                n -= a[j];
                break;
            }
        }
    }
    ans[k - 1] = n;
    for(int x: ans) printf("%d ", x);
    puts("");
}

signed main()
{
    LL p = 1;
    for(int i = 0; i < 10; i ++ ) {
        a[i] = p;
        p *= 10;
    }
    int T = 1; cin >> T;
    while(T -- ) {
        solve();
    }

    return 0;
}