首页 > 其他分享 >Codeforces Round #825 (Div. 2) A - C

Codeforces Round #825 (Div. 2) A - C

时间:2022-10-11 13:36:18浏览次数:46  
标签:int Codeforces cin ++ cnt2 cnt1 ans 825 Div

A

模拟即可。

void solve() {
    int n; cin >> n;
    vector<int> a(n), b(n);
    int cnt1 = 0, cnt2 = 0;
    for (int i = 0;i < n;i++) {
        cin >> a[i];
        if (a[i]) cnt1 ++;
    }
    for (int i = 0;i < n;i++) {
        cin >> b[i];
        if (b[i]) cnt2 ++;
    }
    int ans = 0;
    if (a == b) {
        cout << ans << endl;
        return;
    }
    else if (cnt1 > cnt2) {
        ans = cnt1 - cnt2;
        for (int i = 0;i < n;i++) {
            if (a[i] == 0 && b[i] == 1) {
                ans++;
                break;
            }
        }
    }
    else if (cnt2 >= cnt1) {
        ans = cnt2 - cnt1;
        for (int i = 0;i < n;i++) {
            if (b[i] == 0 && a[i] == 1) {
                ans++;
                break;
            }
        }
    }
    cout << ans << endl;
}

B

我们可以发现如果能找到这样的序列,根据\(gcd\)的定义,有任意\(a[i] \ mod \ (gcd(a[i-1],a[i+1]))\neq{0}\), 否则一定有相邻三项之间出现矛盾。

void solve() {
    int n; cin >> n;
    vector<int> a(n + 1);
    for (int i = 1;i <= n;i++) cin >> a[i];
    a[0] = a[1];
    bool ok = true;
    for (int i = 1;i < n - 1;i++) {
        if (a[i + 1] % gcd(a[i], a[i + 2]) != 0) ok = false;
    }
    cout << (ok ? "YES\n" : "NO\n");
}

C

考虑怎么统计答案。
对于任意\(a[i]\),我们考虑以\(a[i]\)为终点向前延申,最多能延伸的长度为多少,有递推公式:\(len[i]=min(len[i-1]+1,a[i])\)。
则\(ans=\sum {len[i]}\),可以\(O(n)\)求解。

void solve() {
    int n; cin >> n;
    vector<int> a(n + 1), res(n + 1);
    ll ans = 0;
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
        res[i] = min(res[i - 1] + 1, a[i]);
        ans += res[i];
    }
    cout << ans << endl;
}

标签:int,Codeforces,cin,++,cnt2,cnt1,ans,825,Div
From: https://www.cnblogs.com/coldarra/p/16778858.html

相关文章