题目描述:
爱音想要构造一个由 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;
}
如有错误烦请指正谢谢

京公网安备 11010502036488号