1. 程式人生 > 其它 >Codeforces Round #742 (Div. 2)

Codeforces Round #742 (Div. 2)

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;
}