Codeforces #698 Div.2 (A~D題)我的題解記錄

1478A. Nezzar and Colorful Balls

看半天題,而後才發現是統計最大值。ios

int _;
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    for (cin >> _; _--;) {
        int n;
        cin >> n;
        vector<int> a(n + 1, 0);
        for (int i = 0, x; i < n; ++i) cin >> x, a[x]++;
        cout << *max_element(a.begin(), a.end()) << "\n";
    }
    return 0;
}

1478B. Nezzar and Lucky Number

int _;
int dp[1010];
bool f(int x, int d) {
    while (x) {
        if (x % 10 == d) return true;
        x /= 10;
    }
    return false;
}
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    for (cin >> _; _--;) {
        int q, x, d;
        cin >> q >> d;
        vector<int> v(15, 1e9);
        for (int i = 1; i <= 100; ++i) {
            x = i % d;
            if (f(i, d)) v[x] = min(v[x], i);
        }
        for (int i = 1; i <= q; ++i) {
            cin >> x;
            if (v[x % d] <= x)
                cout << "YES\n";
            else
                cout << "NO\n";
        }
    }
    return 0;
}

1478C. Nezzar and Symmetric Array

對d數組排個序,看一個每一個出現的奇偶次數,其實 d 的順序就是 a(絕對值) 的順序對應過去的,兩組應該是對稱出現的。。c++

那能夠按順序求出對應的 a,要是求不出來或者出現重複,那麼就失敗,不然成功。數組

int _;
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    for (cin >> _; _--;) {
        int n;
        cin >> n;
        vector<ll> d(2 * n);
        for (auto& x : d) cin >> x;
        sort(d.rbegin(), d.rend()); // 注意這裏是逆排
        bool yn = 1;
        ll sum = 0;
        for (int i = 2; i < 2 * n; i += 2)
            if (d[i] == d[i - 1]) yn = 0;

        for (int i = 0; i < n && yn; i++) {
            if (d[2 * i] != d[2 * i + 1]) {
                yn = 0;
                break;
            }
            if ((d[2 * i] - sum) <= 0 or (d[2 * i] - sum) % (n - i) != 0) {
                yn = 0;
                break;
            }
            ll cur = (d[2 * i] - sum) / (n - i);
            if (cur & 1) {
                yn = 0;
                break;
            }
            sum += cur;
        }
        cout << (yn ? "YES\n" : "NO\n");
    }
    return 0;
}

1478D. Nezzar and Board

\(2*x−y\) x想成 \(x + x − y\) ,也就是x加上x 和y的差值,這個差值能夠是正的也能夠是負的。執行完以後咱們能夠對新的數字繼續增長這個差值,因此咱們就能夠根據兩個數字得出一個等差數列。數列內的數字均可以倍包含在數組a裏。spa

而咱們的目的是找出一個最小的差值 \(d\),而後分別比對每個 \(a[i]\)看是否能夠由 \(a[i]\)和若干個 \(d\) 獲得 k。先對 a 數組排個序,而後對全部的$ a[ i ]− a[ i − 1] $求 gcd,就得出了那個最小的差值 d。code

// RioTian 21/01/29
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int _, n;
ll k;
ll gcd(ll a, ll b) { return a % b == 0 ? b : gcd(b, a % b); }
int main() {
    ios_base::sync_with_stdio(false), cin.tie(0);
    for (cin >> _; _--;) {
        cin >> n >> k;
        vector<ll> a(n + 1);
        for (int i = 1; i <= n; i++) cin >> a[i];
        sort(a.begin() + 1, a.end());

        ll tmp = a[2] - a[1];
        for (int i = 2; i < n; i++) tmp = gcd(tmp, a[i + 1] - a[i]);

        ll x = llabs(a[1] - k);
        cout << (x % tmp == 0 ? "YES\n" : "NO\n");
    }
    return 0;
}
相關文章
相關標籤/搜索