题目描述:

爱音想要构造一个由 a 个 0 和 b 个 1 组成的 01 字符串,且使得这个 01 字符串所有非空连续子串的 mex 之和最大。 在本题中,01 串的 mex 定义为:字符串最小未出现的非负整数。例如, mex("0")=1、mex("1")=0、mex("1100")=2。

题解:

由题目可知,如果想要所有非空连续子串的mex之和最大,那么我们就要使所有非空连续字串尽可能都包含0和1,当0多1少时,我们选择将0的个数n除以1的个数加一,即m+1,设num=n/(m+1),把n分为m+1份,这样可以使连续的0字串个数尽可能减少,以达到最大化mex的目的,但num并不是固定的,每次循环,视作减去num个0和1个1,剩下的字串视为一个新的有n-num个0和m-1个1的string,重新计算num,直至m等于0(1多0少时同理)。

代码如下:

void solve()
{
	ll n,m;
	cin>>n>>m;
    if(n>m)
	{
        while(m>0)
		{
            ll num=n/(m+1);
            while(num--)
                cout<<0; 
            cout<<1;
            n-=n/(m+1);
            m--;
        }
        while(n--)
            cout<<0;
	}
	else
	{
		 while(n>0)
		{
            ll num=m/(n+1);
            while(num--)
                cout<<1;
            cout<<0;
            m-=m/(n+1);
            n--;
        }
        while(m--)
            cout<<1;
	}
	cout<<endl;
}

如有错误烦请指正谢谢