Codeforces Round #779 (Div. 2)

 A

题目连接

题目大意

给一个01串,其中每一个长度大于等于2的子区间中0的数量不大于1的数量,最少插入多少1

思路

寻找 00 和 010

00 -->0110     加2

010 -->0110   加1

代码

#include <bits/stdc++.h>
using namespace std;
int t;
int main()
{
    std::ios::sync_with_stdio(false);
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        string s;
        cin >> s;
        if (n == 1)
        {
            cout << "0" << endl;
            continue;
        }
        int z = 0;
        for (int i = 0; i < n; i++)
        {
            if (s[i] == '0')
                z++;
        }
        if (z == 0 || z == 1 && n >= 2)
        {
            cout << "0" << endl;
            continue;
        }
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            if (s[i] == '0')
            {
                for (int j = i + 1; j < n; j++)
                {
                    if (s[j] == '0')
                    {
                        if (j - i == 1)
                            ans += 2;
                        else if (j - i == 2)
                            ans += 1;
                        i = j - 1;
                        break;
                    }
                }
            }
        }
        cout << ans << endl;
    }
    return 0;
}
 
小结:

简单的字符串问题,从最小的单元为起点去思考

B

题目链接

题意

给一个1~n的排列,若满足以下条件则是一个“美丽排列”。


gcd(1*p1,2*p2,...,n*pn) > 1 ( gcd 求所以元素的最大公约数 )

给定一个n,问有多少种美丽排列,模998244353 。

思路

若 n 为奇数则答案为 0

为偶数则让奇偶相乘 有 (n/2)! * (n/2)!

代码

#include <bits/stdc++.h>
using namespace std;
int mod = 998244353;
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        long long a = 1;
        int n;
        cin >> n;
        if (n % 2 == 1)
        {
            cout << 0 << endl;
            continue;
        }
        for (int i = 1; i <= n / 2; i++)
        {
            a = a * i;
            a = a % mod;
        }
        cout << (a * a) % mod << endl;
    }
    return 0;
}

C

题目链接

题目大意

这题目题意贼绕

给一个1~n的排列p,根据p做数列b,bi表示p1~pi中的最大值。b数列中不同的数值数量就是排列p的力量。

现在给出数列c,ci表示p向左循环右移i-1位所得到的力量值。问给出的c有没有可能被一种p得到。

思路

观察可知 1 有且只有一个,不符合的可直接判错

通过几组数据模拟可发现,每移动一位 ,下一个力量值最多增加 1 以此判断是否正确

需要注意最后一位也要对第一为进行判断

代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T--)
    {
        int n;
        cin >> n;
        int s[n+1];
        int flag = 0;
        for (int i = 0; i < n; i++)
        {
            cin >> s[i];
            if (s[i] == 1)
                flag++;
        }
        s[n]=s[0];
        int k = 1;
        for (int i = 0; i + 1 <= n; i++)
            if (s[i + 1] - s[i] > 1)
            {
                k = 0;
                break;
            }
        if (k == 1 && flag == 1)
            cout << "YES\n";
        else
            cout << "NO\n";
    }
    return 0;
}

 

posted @ 2022-03-30 14:06  黎_lyh  阅读(78)  评论(0)    收藏  举报