Codeforces Global Round 20 A - C

Codeforces Global Round 20

感觉这场难。。
https://codeforces.com/contest/1672

A.Log Chopping

思路

统计总共要被划分多少次,判断奇偶性:奇数则先手胜出,偶数则后手胜出

Code

#include <bits/stdc++.h>

using namespace std;

int main () {
    int t;
    cin >> t;
    while (t --) {
        int n;
        int ans = 0;
        cin >> n;
        while (n --) {
            int x;
            cin >> x;
            ans += x - 1;
        }
        if (ans % 2)
            cout << "errorgorn" << endl;
        else
            cout << "maomao90" << endl;
    }
}
//把要分的次数算出来,判断奇偶

B.I love AAAB

思路

全A 结尾是A 开头是B 也不行
连续的是可以的,有多少个B,前面就要至少有多少个A
(中间可以插入AA..B)

Code

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5;
bool vis[N];

int main () {
    int t;
    cin >> t;
    while (t --) {
        string s;
        cin >> s;
        int n = s.size();
        if (n == 1) {
            cout << "NO" << endl;
            continue;
        }

        if (s[n - 1] == 'A' || s[0] == 'B') {
            cout << "NO" << endl;
            continue;
        }

        vector<int> b;
        for (int i = 0; i < n; i ++)    
            if (s[i] == 'B')
                b.push_back (i);
        
        if (b.empty()) {
            cout << "NO" << endl;
            continue;
        }

        memset (vis, false, sizeof vis);
        int cnt = 0; //成功配对的数量
        bool suc = true;
        for (int i = b.size() - 1; i >= 0; i --) {
            for (int j = b[i] - 1; j >= 0; j --) {
                if (s[j] == 'A' && !vis[j]) {
                    vis[j] = true;
                    cnt ++;
                    break;
                }
                    
            }

        }
        if (cnt < b.size())
            suc = false;

        if (suc)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
}
// 全A 结尾是A 开头是B 也不行
// 连续的是可以的,找对应
// 有多少个B,前面就要至少有多少个A

// 最开始有个误区!改过来就好

C.Unequal Array

思路

题意:相邻的两个数相等,则相等数++
一种迭代更新的感觉

//包含所有连续相同段的最小区间长度-3(除去头尾)
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 5;
int t, n, a[N];

signed main() {

    cin >> t;
    while (t --) {
        int ans = 0;
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> a[i];

        bool suc = true;     
        int l = -1, r = 0; 
        for (int i = 2; i <= n; i++) {
            if (a[i] == a[i - 1]) {
                if (suc)
                    suc = false, l = i - 1, r = i; 
                else
                    r = i;
            }
        }

        int len = r - l + 1;
        
        if (len > 2)
            ans = max(1ll, len - 3);
        else
            ans = 0; //特判
        cout << ans << endl;
    }

    return 0;
}
posted @ 2022-04-24 22:24  Sakana~  阅读(70)  评论(0编辑  收藏  举报