Codeforces ラウンド 970 (Div. 3)

A. サクラコの試験

解法

全探索で解く。

コード


#include <iostream>

using namespace std;

void solve() {
    int a, b;
    cin >> a >> b;

    for (int i = 0; i <= a; i++) {
        for (int j = 0; j <= b; j++) {
            if (i + j * 2 == (a - i) + (b - j) * 2) {
                cout << "YES\n";
                return;
            }
        }
    }

    cout << "NO\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

B. 正方形判定

解法

n が完全平方数かを確認し、文字列の最初と最後の m 文字が 1 で埋まっているか、真ん中の部分が 100...001 の形式になっているかをチェックする。

コード


#include <iostream>
#include <cmath>

using namespace std;

void solve() {
    int n;
    cin >> n;

    string s;
    cin >> s;

    int m = sqrt(n);
    if (m * m != n) {
        cout << "No\n";
        return;
    }

    string top = string(m, '1');
    string mid = "1" + string(m - 2, '0') + "1";

    if (s.substr(0, m) != top || s.substr(n - m) != top) {
        cout << "No\n";
        return;
    }

    for (int i = m; i < n - m; i += m) {
        if (s.substr(i, m) != mid) {
            cout << "No\n";
            return;
        }
    }

    cout << "Yes\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C. 最長の良い配列

解法

公差が 1 の等差数列を使って最適な配列を構築する。差分の総和を用いて最大の項数を求めればよい。

コード


#include <iostream>

using namespace std;

void solve() {
    long long a, b;
    cin >> a >> b;

    long long l = 1, r = 2e9, ans = 0;
    while (l <= r) {
        long long mid = (l + r) / 2;
        if (mid * (mid + 1) <= (b - a) * 2) {
            l = mid + 1;
            ans = mid;
        } else {
            r = mid - 1;
        }
    }

    cout << ans + 1 << "\n";
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

タグ: codeforces 競技プログラミング C++

5月23日 04:19 投稿