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并且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个数字在十一进制下的和最大

思路#

我们肯定是要使最高位最大,因此我们贪心的从大到小枚举10i 如果当前的n10i大而且可以使后面的数字最少分到1
我们就把这一个数字赋值为10i, 然后枚举到第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;
}
 
posted @   ccz9729  阅读(71)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
主题色彩