接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

AtCoder Beginner Contest 227(ABC227)

atcoder.jp

A - Last Card

$ A + K - 1 \pmod{N} $ が答え

提出コード

void solve(){
    int N, K, A;
    cin >> N >> K >> A;
    cout << (A - 1 + K - 1) % N + 1 << endl;
}

B - KEYENCE building

$ 1 \leq a, b \leq 1000 $ の範囲で全探索をする

提出コード

void solve(){
    int N;
    cin >> N;
    vector<int> S(N);
    REP(i,N) cin >> S[i];
    vector<int> ok(N);
    for(int a=1;a<=1000;a++) for(int b=1;b<=1000;b++){
        ll sum = 4 * a * b + 3 * a + 3 * b;
        REP(i,N) if(S[i] == sum) ok[i] = 1;
    }
    cout << N - accumulate(ALL(ok), 0) << endl;
}

C - ABC conjecture

$ 1 \leq a \leq \sqrt[3]{N} $ の範囲、$ 1 \leq b \leq \sqrt{\frac{N}{a}} $ の範囲となるので全探索をする

提出コード

void solve(){
    ll N;
    cin >> N;
    ll ans = 0;
    for(ll a=1;a*a*a<=N;a++){
        for(ll b=a;b*b<=N/a;b++){
            ans += N / (a * b) - b + 1;
        }
    }
    cout << ans << endl;
}

D - Project Planning

プロジェクトが $ P $ 個作れるかどうかを二分探索をする
プロジェクトが $ P $ 個作れるかどうかは、$ \sum \min(A_i, P) <= PK $ を満たしていればいい

提出コード

void solve(){
    ll N, K;
    cin >> N >> K;
    vector<ll> A(N);
    REP(i,N) cin >> A[i];
    auto check = [&](ll m) -> bool{
        ll sum = 0;
        REP(i,N) sum += min(A[i], m);
        return (sum / m >= K ? true : false);
    };
    ll l = 0, r = LINF;
    while(r - l > 1){
        ll m = (l + r) >> 1;
        if(check(m)) l = m;
        else r = m;
    }
    cout << l << endl;
}