开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
}