Team CodeForces - 401C
原题链接
考察:贪心
思路:
原本的思路是根据给定1的的数量确定0数量的范围.假定当前1的数量为n,那么0的数量m的范围是 \(\frac{n-1}{2}<=m<=n{\quad} (n>=0)\).根据范围是否合法进行两种操作:
- \(res+="110"\)
- \(res+="10"\)
但是这都是以n>=m的前提进行操作,如果m>n只能是m = n+1,否则不合法,对于这种情况,我们先加一个"0"即可.
Code
#include <iostream>
#include <cstring>
using namespace std;
int n,m;
bool check(int n1,int n0)
{
if(!n1&&!n0) return 1;
if((n1-1)/2<=n0&&n0<=n1) return 1;
return 0;
}
string solve()
{
string res;
if(m==n+1) res+="0",m--;
if((m>n||m<(n-1)/2)&&n&&m) return "-1";
while(n&&m)
{
if(n>=2&&check(n-2,m-1)) res+="110",n-=2;
else if(n&&check(n-1,m-1)) res+="10",n--;
else return "-1";
m--;
}
if(n<=2&&(res.size()==0||res.back()=='0'))
{
while(n--) res+="1";
n = 0;
}
if(m<2&&(res.size()==0||res.back()=='1'))
{
while(m--) res+="0";
m = 0;
}
if(m||n) return "-1";
return res;
}
int main()
{
scanf("%d%d",&m,&n);//m 0 n 1
printf("%s\n",solve().c_str());
return 0;
}