zoukankan      html  css  js  c++  java
  • AIM Tech Round 3 (Div. 1) B. Recover the String 构造

    B. Recover the String

    题目连接:

    http://www.codeforces.com/contest/708/problem/B

    Description

    For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x, y}.

    In these problem you are given four integers a00, a01, a10, a11 and have to find any non-empty string s that matches them, or determine that there is no such string. One can prove that if at least one answer exists, there exists an answer of length no more than 1 000 000.

    Input

    The only line of the input contains four non-negative integers a00, a01, a10 and a11. Each of them doesn't exceed 109.

    Output

    If there exists a non-empty string that matches four integers from the input, print it in the only line of the output. Otherwise, print "Impossible". The length of your answer must not exceed 1 000 000.

    Sample Input

    1 2 3 4

    Sample Output

    Impossible

    Hint

    题意

    你要构造一个只含有01的串,其中子序列:00有a个,01有b个,10有c个,11都d个。

    如果不能,输出impossible

    题解:

    通过00和11,我们知道这个串里面0和1分别有多少个,然后我们就可以构造了。

    假设0全部放在前面,1全部放在后面,那么如果把一个1扔到最前面,那么C就会减去当前0的个数。

    然后我们就通过这个玩意儿去构造就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    long long f(long long x)
    {
        return x*(x-1)/2;
    }
    long long a,b,c,d,A,B;
    int flag=0;
    int main()
    {
        cin>>a>>b>>c>>d;
        for(long long i=0;f(i)<=a;i++)
        {
            if(f(i)==a)
            {
                for(long long j=0;f(j)<=d;j++)
                {
                    if(f(j)==d)
                    {
                        if(i*j==b+c)
                        {
                            A=i;
                            B=j;
                            flag=1;
                        }
                    }
                }
            }
        }
        if(flag==0)
            return puts("Impossible"),0;
        if(A==0&&B==0)
            return puts("Impossible"),0;
        int sum = A+B;
        for(int i=0;i<sum;i++)
        {
            if(c>=A)
            {
                B--;
                c-=A;
                printf("1");
            }
            else
            {
                A--;
                printf("0");
            }
        }
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    urllib.request.urlretrieve()
    python2.X与python3.X爬虫常用的模块变化对应
    .net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法
    批量引用iconfont字体图标到项目
    动态设置bootstrapswitch状态
    MD5加密过时方法替换
    SQL语句
    PHP中的闭包
    算法复杂度
    快速排序
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5830824.html
Copyright © 2011-2022 走看看