AtCoder Beginner Contest 028(ABC028) 解説

ABC

A – テスト評価

A - テスト評価
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

問題文の通りにif文を書くだけです。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    int N;
    cin>>N;
    if(N<=59) cout<<"Bad"<<endl;
    else if(N<=89) cout<<"Good"<<endl;
    else if(N<=99) cout<<"Great"<<endl;
    else cout<<"Perfect"<<endl;
}

B – 文字数カウント

B - 文字数カウント
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

文字列として受け取って、forで一文字ずつ見ながらカウントする方法が普通かと思います。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    int cnt[6]={0};
    string S;
    cin>>S;

    for(int i=0;i<S.size();i++){
        cnt[S[i]-'A']++;
    }

    cout<<cnt[0]<<" "<<cnt[1]<<" "<<cnt[2]<<" "<<cnt[3]<<" "<<cnt[4]<<" "<<cnt[5]<<endl;
}

文字は内部的には整数値です。(ASCIIコード)
A,B,C,D…は連番になっており、後ろになるほど大きくなります。
なので、’A’-‘A’=0,’B’-‘A’=1,’C’-‘A’=3…と’A’を引くことで、アルファベット何文字目かを取得できます。

C – 数を3つ選ぶマン

C - 数を3つ選ぶマン
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

5文字から3つなので、5C3=10通りとパターンが少ないです。
手打ちで全列挙しました。真面目にやるなら、3重for回すのが一番普通かと思います。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    int A,B,C,D,E;
    cin>>A>>B>>C>>D>>E;

    int ans[10];
    ans[0]=A+B+C;
    ans[1]=A+B+D;
    ans[2]=A+B+E;
    ans[3]=A+C+D;
    ans[4]=A+C+E;
    ans[5]=A+D+E;
    ans[6]=B+C+D;
    ans[7]=B+C+E;
    ans[8]=B+D+E;
    ans[9]=C+D+E;

    sort(ans,ans+10);

    cout<<ans[7]<<endl;
}

下のコードはforで書こうと思ったら、予想以上にややこしくなったものです。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    int A,B,C,D,E;
    int mx1=0,mx2=0,mx3=0;
    cin>>A>>B>>C>>D>>E;
    for(int i=0;i<5;i++){
        for(int j=i+1;j<5;j++){
            for(int k=j+1;k<5;k++){
                if(i!=j&&j!=k&&i!=k){
                    int n=0;
                    if(i==0||j==0||k==0) n+=A;
                    if(i==1||j==1||k==1) n+=B;
                    if(i==2||j==2||k==2) n+=C;
                    if(i==3||j==3||k==3) n+=D;
                    if(i==4||j==4||k==4) n+=E;
                    if(mx1<n){
                        mx3=mx2;
                        mx2=mx1;
                        mx1=n;
                    }
                    else if(mx2<n){
                        mx3=mx2;
                        mx2=n;
                    }
                    else if(mx3<n){
                        mx3=n;
                    }
                }
            }
        }
    }
    cout<<mx3<<endl;
}

D – 乱数生成

D - 乱数生成
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

中央値がKとなるためには、以下のパターンのどれかである必要があります。

  1. (K,Kより大きい,Kより小さい)
  2. (K,K,Kより大きい)
  3. (K,K,Kより小さい)
  4. (K,K,K)

また、数字の順番は特に関係ないため、1,2,3はそれぞれ入れ替えのパターンを考えればOKです。
中央値がKになるパターンを、全パターン数のN*N*Nで割ればOKです。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    double N,K;
    cin>>N>>K;

    double c=1;
    c*=1;
    c*=(K-1);
    c*=(N-K);
    c*=6;

    double c2=1;
    c2*=1;
    c2*=1;
    c2*=(N-K);
    c2*=3;

    double c3=1;
    c3*=1;
    c3*=(K-1);
    c3*=1;
    c3*=3;

    double c4=1;
    c4*=1;
    c4*=1;
    c4*=1;
    c*=1;

    printf("%.12f\n",(c+c2+c3+c4)/(N*N*N));
}

中央値Kの総数の式を纏めると、

 (K-1)*(N-K)*6+(N-K)*3+(K-1)*3+1
=(K-1)*(N-K)*6+(N-K+K-1)*3+1
=(K-1)*(N-K)*6+(N-1)*3+1

となるため、まとめて下記コードでもOKです。

#include<bits/stdc++.h>
#include<atcoder/all>

using namespace std;
using namespace atcoder;

int main(){
    double N,K;
    cin>>N>>K;
    printf("%.12f\n",((K-1)*(N-K)*6+(N-1)*3+1)/(N*N*N));
}

関係ない話

SteamでApexを始めたのですが、むちゃくそ難しいですね…。
0ダメで終わる試合がほとんどです…。
フレンドだと気楽でいいのですが、野良は怖さもあります> <

コメント

タイトルとURLをコピーしました