logo
mumemo

AtCoder Beginner Contest 364 復習

作成日時:2024/07/28
program
AtCoder
C++
ホームへ戻る

ABC364に参加しました。

A-Glutton Takahashi

問題要約

入力形式

NS1S2SNN\\ S_1\\ S_2\\ \vdots\\ S_N

解答要約

コード

language: c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;

int main(){
    //N:料理の数
    ll N;
    cin >> N;

    //count:連続でsweetが出た回数
    ll count = 0;
    for(ll i=0;i<N;i++){
        if(count >= 2){
            //前回までで、連続で甘い料理を食べた回数が2回以上の場合、今回の料理を食べられない
            cout << "No" << endl;
            return 0;
        }
        //s:今回の料理の味
        string s;
        cin >> s;
        if(s == "sweet"){
            //甘い料理の場合、countをインクリメント
            count++;
        }else{
            count = 0;
        }
    }
    //全ての料理を食べ終わった場合、Yes
    cout << "Yes" << endl;
    return 0;
}

B- Grid Walk

問題要約

入力形式

HWSiSjC1,1C1,2...C1,WC2,1C2,2...C2,WCH,1CH,2...CH,WXH\quad W\\ S_i\quad S_j\\ C_{1,1}C_{1,2}...C_{1,W}\\ C_{2,1}C_{2,2}...C_{2,W}\\ \vdots\\ C_{H,1}C_{H,2}...C_{H,W}\\ X

解答要約

コード

language: c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;

int main(){
    //H:高さ、W:幅
    ll H,W;
    cin >> H >> W;

    //(Si,Sj):現在地
    //Si:上からi番目,Sj:左からj番目
    ll Si,Sj;
    cin >> Si >> Sj;
    //0-indexedに変換
    Si--; Sj--;

    //S:迷路
    vector<string> S(H);
    for(ll i=0;i<H;i++){
        cin >> S[i];
    }

    //X:移動する方向の指示
    string X;
    cin >> X;
    for(char now: X){
        //now:今の指示
        switch(now){
            case 'L':
                //左に移動できる場合、左に移動
                if(Sj > 0 && S[Si][Sj-1] != '#'){
                    Sj--;
                }
                break;
            case 'R':
                //右に移動できる場合、右に移動
                if(Sj < W-1 && S[Si][Sj+1] != '#'){
                    Sj++;
                }
                break;
            case 'U':
                //上に移動できる場合、上に移動
                if(Si > 0 && S[Si-1][Sj] != '#'){
                    Si--;
                }
                break;  
            case 'D':
                //下に移動できる場合、下に移動
                if(Si < H-1 && S[Si+1][Sj] != '#'){
                    Si++;
                }
                break;
        }
    }

    //1-indexedに変換して移動後の位置を出力
    cout << Si+1 << " " << Sj+1 << endl;
}

C-Minimum Glutton

問題要約

入力形式

NXYA1A2...ANB1B2...BNN\quad X\quad Y\\ A_1\quad A_2\quad ...\quad A_N\\ B_1\quad B_2\quad ...\quad B_N

解答要約

コード

language: c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;

int main(){
    //N:料理の数、X:甘さの上限、Y:しょっぱさの上限
    ll N,X,Y;
    cin >> N >> X >> Y;

    //N個の料理の A:甘さ、B:しょっぱさ
    vector<ll> A(N),B(N);
    for(ll i=0;i<N;i++){
        cin >> A[i];
    }
    for(ll i=0;i<N;i++){
        cin >> B[i];
    }

    //甘さの降順、しょっぱさの降順にソート
    sort(A.rbegin(),A.rend());
    sort(B.rbegin(),B.rend());

    //sumA:甘さの合計、sumB:しょっぱさの合計
    ll sumA=0,sumB=0;
    for(ll i=0;i<N;i++){
        //甘い順、しょっぱい順にそれぞれ料理を食べた場合をシミュレートし、どちらかの限界(X,Y)を超えた時、食べた料理の数を出力
        sumA += A[i];
        sumB += B[i];
        if(sumA > X || sumB > Y){
            cout << i+1 << endl;
            return 0;
        }
    }
    //限界を超えなかった場合、全ての料理を食べたことになる
    cout << N << endl;
}

D-K-thNearest

問題要約

入力形式

NQa1a2...aNb1k1b2k2bQkQN\quad Q\\ a_1\quad a_2\quad ...\quad a_N\\ b_1\quad k_1\\ b_2\quad k_2\\ \vdots\\ b_Q\quad k_Q

解答要約

コード

language: c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;

int main(){
    //N:点A[i]の数
    //Q:クエリの数
    ll N,Q;
    cin >> N >> Q;

    //A:点A[i]の座標の配列
    vector<ll> A(N);
    for(ll i=0;i<N;i++){
        cin >> A[i];
    }
    //Aを昇順にソート
    sort(A.begin(),A.end());

    for(ll i=0;i<Q;i++){
        //各クエリを処理する

        //b:点bの座標
        //k:bからk番目に近い点A[i]を考える
        ll b,k;
        cin >> b >> k;

        //2分探索でb以下でindexが最大のA[i]を求める
        //A[l] <= b < A[l+1]となるlを求める
        ll l=-1,r=N,mid=(l+r)/2;
        while(l+1 < r){
            mid = (l+r)/2;
            if(A[mid] <= b){
                l = mid;
            }else{
                r = mid;
            }
        }
        if(l+1<N && abs(b-A[l]) > abs(A[l+1]-b)){
            //A[l] <= b < A[l+1]であるため、A[l]とA[l+1]のうちbに近い方を選ぶ
            l = l+1;
        }

        ll d1=1e9,d2=1e9;
        for(ll j=max(0LL,l-k+1);j<l+k;j++){
            //A[l]を含む連続したk個の点A[i]を考える

            //A[L]からA[R]について考える
            ll L,R;
            L = j;
            R = L+k-1;
            if(R >= N){
                break;
            }

            //A[L]からA[R]のうちbから最も遠い点とbの距離を求める
            d2 = max(abs(A[L]-b),abs(A[R]-b));
            if(d2 <= d1){
                d1 = d2;
            }else{
                //d2が更新されなかった時、A[L]からA[R]がbから近い順にk個集めた点の集合となる
                break;
            }
        }
        cout << d1 << endl;
    }
}

E-Maximum Glutton

問題要約

入力形式

NXYA1B1A2B2ANBNN\quad X\quad Y\\ A_1\quad B_1\\ A_2\quad B_2\\ \vdots\\ A_N\quad B_N

解答要約

コード

language: c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
typedef long long ll;

int main(){
    //N:料理の数、X:甘さの上限、Y:しょっぱさの上限
    ll N,X,Y;
    cin >> N >> X >> Y;

    //N個の料理の A:甘さ、B:しょっぱさ
    vector<ll> A(N),B(N);
    for(ll i=0;i<N;i++){
        cin >> A[i] >> B[i];
    }

    //dp[i][j][k]:i番目(0-indexed)までの料理のうちj個を選んで、甘さがkであるもののうち最小のしょっぱさ
    vector<vector<vector<ll>>> dp(N+1,vector<vector<ll>>(N+1,vector<ll>(X+1,1e9)));
    dp[0][0][0] = 0;
    for(ll i=0;i<N;i++){
        for(ll j=0;j<=i;j++){
            for(ll k=0;k<=X;k++){
                dp[i+1][j][k] = min(dp[i+1][j][k],dp[i][j][k]);
                if(k+A[i] <= X){
                    dp[i+1][j+1][k+A[i]] = min(dp[i+1][j+1][k+A[i]],dp[i][j][k]+B[i]);
                }
            }
        }
    }

    for(ll i=N;i>=0;i--){
        for(ll j=0;j<=X;j++){
            if(dp[N][i][j] <= Y){
                cout << min(i+1,N) << endl;
                return 0;
            }
        }
    }
}
🙇

今週はここまで

F-Range Connect MST

G-Last Major City

一番上へ