AcWing——4784. 构造序列

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

AcWing——4784. 构造序列

4784. 构造序列 - AcWing题库

请你构造一个 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

问题解析

最极限的两个情况就是

  • n==(m-1)/2。此时摆放情况是:11011.
  • n==m+1。此时摆放情况是:010.

那么如果n<(m-1)/2或n>m+1,那就只能输出-1.其它的都是可以构造出正确答案的。

这里我是先输出2个1和1个0的方法把n和m变得一样。

再一个1一个0的输出。

AC代码

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include <random>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<fstream>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#include<bitset>//#pragma GCC optimize(2)
//#pragma GCC optimize(3)#define endl '\n'
#define int ll
#define PI acos(-1)
#define INF 0x3f3f3f3f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PII;
const int N = 2e5 + 50, MOD = 998244353;
​
int a[N];
void solve()
{
    int n, m;
    cin >> n >> m;
    if (n > m + 1 || n < (m - 1) / 2)
    {
        cout << -1 << endl;
        return;
    }
    if (n == m + 1)
    {
        int idx = 1, num = 0;
        while (idx <= n+m)
        {
            cout << num;
            idx++;
            num ^= 1;
        }
        return;
    }
    int cnt = min(n, m - n);
    while (cnt--)
    {
        cout << "110";
        n--;
        m -= 2;
    }
    while (n--)
    {
        cout << "10";
        m--;
    }
    while (m--)cout << 1;
}
​
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
    //cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
​