Codeforces Round #742 (Div. 2)
阿新 • • 發佈:2021-09-06
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的意思是 陣列中最小的沒有出現過的自然數...(百度了十分鐘才查出來,離譜...)
思路
題目給了陣列中的MEX 和 XOR (異或和) 分別是a和b
因此我們可以知道 陣列中一定不存在a並且\(\le a\)的自然數一定會出現
因此我們先預處理出所有的異或字首和 令這個數字為x
那麼我們現在已經有了a個數字,並且異或和為x 我們想要從x 變為b
有三種可能
- x=b 我們輸出 a 即可
- x^b=a 因為a這個數字不能用,所以我們需要兩個數字構造出a 因此輸出a+2
- 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;
}