zoukankan      html  css  js  c++  java
  • [CF1492D] Genius's Gambit

    [CF1492D] Genius's Gambit - 构造

    Description

    给定你三个整数 (a,b,k) ,满足 (0le a;1 le b;k le a + b le 2 imes10^5)。请你构造出两个二进制形式的整数 (x,y),满足 (x ge y)(x,y) 的二进制形式由 (a)(0)(b)(1) 组成,并且 (x - y) 得到的数在二进制下共有 (k)(1)。如果存在合法构造,请输出 ( exttt{Yes}) ,并输出合法的 (x,y)

    Solution

    从高往低数,第 1 位肯定要填 1,第 2 位 x 填 1 y 填 0,第 2+k 位 y 填 1 x 填 0,其它位随便填,保持两个一样,凑够 b 个 1 即可

    这样构造显然是符合条件的,但需要考虑,无法这样构造的情况是否一定无解

    考虑 k>0 的情况,这样构造,至少需要 2 个 1,1 个 0

    如果 a=0,那么显然是构造不出来的

    如果 a>0, b=1,因为第一位必须填 1,所以显然也是构造不出来的

    第一位减出来一定相同,后面无论如何要剩一位,所以 k 最多只能到 a+b-2,否则无解

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    
    signed main()
    {
        ios::sync_with_stdio(false);
    
        int a, b, k;
        cin >> a >> b >> k;
        int n = a + b;
    
        vector<int> x(n + 2), y(n + 2);
        if ((k > 0 && (a < 1 || b < 2 || a + b - 2 < k)))
        {
            cout << "No";
        }
        else
        {
            x[1] = y[1] = 1;
            if (b > 1)
            {
                x[2] = 1;
                y[2 + k] = 1;
                int cnt = b - 2;
                for (int i = 3; i <= n; i++)
                    if (i != 2 + k && cnt)
                        cnt--, x[i] = y[i] = 1;
            }
    
            cout << "Yes" << endl;
            for (int i = 1; i <= n; i++)
                cout << x[i];
            cout << endl;
            for (int i = 1; i <= n; i++)
                cout << y[i];
            cout << endl;
        }
    }
    
  • 相关阅读:
    Java之装饰模式
    Sharding-jdbc(一)分库分表理解
    JVM(四)JVM的双亲委派模型
    JVM(三)JVM的ClassLoader类加载器
    JVM(二)JVM的结构
    JVM(一)JVM的概述与运行流程
    Redis随笔(六)RESP的协议规范
    Redis随笔(五)Jedis、jedisCluster的使用
    Collections.synchronizedList使用方法陷阱(1)
    Collections.synchronizedList使用方法
  • 原文地址:https://www.cnblogs.com/mollnn/p/14456371.html
Copyright © 2011-2022 走看看