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;
        }
    }
    
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/mollnn/p/14456371.html
Copyright © 2011-2022 走看看