acwing周赛--01序列

112 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情 请你构造一个 0101 序列,序列需要满足以下所有要求:

  • 恰好包含 nn 个 00 和 mm 个 11。
  • 不存在两个或两个以上的 00 连续相邻。
  • 不存在三个或三个以上的 11 连续相邻。

输入格式

共一行,包含两个整数 n,mn,m。

输出格式

输出共一行,如果存在满足条件的 0101 序列,则输出满足条件的 0101 序列,否则输出 -1

如果答案不唯一,则输出任意合理答案均可。

数据范围

前 66 个测试点满足 1≤n,m≤101≤n,m≤10。
所有测试点满足 1≤n,m≤1061≤n,m≤106。

输入样例1:

1 2

输出样例1:

101

输入样例2:

4 8

输出样例2:

110110110101

输入样例3:

4 10

输出样例3:

11011011011011

输入样例4:

1 5

输出样例4:

-1
难度:困难
时/空限制:1s / 256MB
总通过数:564
总尝试数:2356
来源:AcWing,第82场周赛
算法标签

挑战模式

分析

这题是一个构造题,最近经常做构造题,qaq,这也算是第一次AK acwing周赛,这题其实是个排列组合问题,就算给n个0,m个1,因为题目要求m个1不能超过2个连续,n个0不能超过1个连续,其实就是给n个1,再插空排列组合,,就需要考虑插1个1或者2个1,取模就发现很简单了。

代码1

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1000010;
int a[N];
int main(){
	int n,m;//n:0,m:1
	cin>>n>>m;
	if(m>2*(n+1) || n-m>1){
		puts("-1");
		return 0;
	}
	if(n>=m){
		for(int i=1;i<=n+m;i++){
			if(i & 1){
				cout<<0;
			}
			else cout<<1;
		}
	}
	else{
		int yu=m%(n+1);
		int chu=m/(n+1);
		if(yu==0){
			if(chu==1){
				cout<<1;
				for(int i=1;i<=n;i++){
					cout<<0<<1;
				} 
			}
			else{
				cout<<11;
				for(int i=1;i<=n;i++){
					cout<<0<<11;
				}
			}
				
		} 
		else{
			cout<<11;
			for(int i=1;i<=yu-1;i++){
				cout<<0<<11;
			}
			for(int i=yu;i<=n;i++){
				cout<<0<<1;
			}
		}
	}
	return 0;
}