Team CodeForces - 401C

原题链接
考察:贪心
思路:
  原本的思路是根据给定1的的数量确定0数量的范围.假定当前1的数量为n,那么0的数量m的范围是 \(\frac{n-1}{2}<=m<=n{\quad} (n>=0)\).根据范围是否合法进行两种操作:

  1. \(res+="110"\)
  2. \(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;
}
posted @ 2021-06-29 23:27  acmloser  阅读(34)  评论(0编辑  收藏  举报