AtCoder Beginner Contest 039(ABC039)

ABC

A – 高橋直体

A – 高橋直体 (atcoder.jp)

直方体は、A*B、B*C、A*Cの面を二つずつ持っているため、それぞれの面積を計算し足し合わせばOKです。

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

using namespace std;
using namespace atcoder;

int main(){
    int A,B,C;
    cin>>A>>B>>C;
    cout<<A*B*2+B*C*2+A*C*2<<endl;
}

B – エージェント高橋君

B – エージェント高橋君 (atcoder.jp)

N^4=(N^2)^2です。
C++の場合、sqrtで2乗根の計算ができるので、それを2回通してやれば4乗根になります。

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

using namespace std;
using namespace atcoder;

int main(){
    long long N;
    cin>>N;
    cout<<sqrt(sqrt(N))<<endl;
}

sqrtは誤差が怖いよ!って場合は、制約が弱いのでNを全探索しても問題ありません。(Xの最大が10^9なので、Nは大きくても10^3程度)

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

using namespace std;
using namespace atcoder;

int main(){
    long long N;
    cin>>N;
    long long ans=1;
    while(1){
        if(ans*ans*ans*ans==N) break;
        ans++;
    }
    cout<<ans<<endl;
}

C – ピアニスト高橋君

C – ピアニスト高橋君 (atcoder.jp)

Doの入力パターンが入力例1にあり、ReやMiはこの入力をずらしたものになるはずです。
なので、全パターンをずらして作成しSと一致するものの、パターンの先頭の音(黒鍵盤を考えるなら、Doから2個ずらせばRe)を出せばOKです。

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

using namespace std;
using namespace atcoder;

int main(){
    string S;
    cin>>S;

    string D="WBWBWWBWBWBW";

    int c=0;
    while(1){
        if(S.substr(0,D.size())==D) break;
        c++;
        D+=D[0];
        D=D.substr(1,D.size()-1);
    }

    if(c==0) cout<<"Do"<<endl;
    if(c==2) cout<<"Re"<<endl;
    if(c==4) cout<<"Mi"<<endl;
    if(c==5) cout<<"Fa"<<endl;
    if(c==7) cout<<"So"<<endl;
    if(c==9) cout<<"La"<<endl;
    if(c==11) cout<<"Si"<<endl;
}

D – 画像処理高橋君

D – 画像処理高橋君 (atcoder.jp)

収縮後の自分1マスと周り1マスが”#”であるなら、そこは収縮前も”#”としていた方が良いです。
なので、上記条件でなるたけたくさん”#”を作成した画像を収縮させ、入力と一致するかを見ればOKです。
制約も弱いのでゴリゴリ書きましょう。

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

using namespace std;
using namespace atcoder;

int main(){
    int H,W;
    cin>>H>>W;
    string S[H];

    for(int i=0;i<H;i++){
        cin>>S[i];
    }

    string ans[H];
    int dp[H][W];
    for(int i=0;i<H;i++){
        ans[i]="";
        for(int j=0;j<W;j++){
            ans[i]+='.';
            dp[i][j]=0;
        }
    }
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            bool f=true;
            if(S[i][j]=='.') f=false;
            if(i-1>=0&&S[i-1][j]=='.') f=false;
            if(i+1<H&&S[i+1][j]=='.') f=false;
            if(j-1>=0&&S[i][j-1]=='.') f=false;
            if(j+1<W&&S[i][j+1]=='.') f=false;
            if(i-1>=0&&j-1>=0&&S[i-1][j-1]=='.') f=false;
            if(i+1<H&&j+1<W&&S[i+1][j+1]=='.') f=false;
            if(i+1<H&&j-1>=0&&S[i+1][j-1]=='.') f=false;
            if(i-1>=0&&j+1<W&&S[i-1][j+1]=='.') f=false;
            if(f){
                dp[i][j]=1;
                if(i-1>=0) dp[i-1][j]=1;
                if(i+1<H) dp[i+1][j]=1;
                if(j-1>=0) dp[i][j-1]=1;
                if(j+1<W) dp[i][j+1]=1;
                if(i-1>=0&&j-1>=0) dp[i-1][j-1]=1;
                if(i+1<H&&j+1<W) dp[i+1][j+1]=1;
                if(i+1<H&&j-1>=0) dp[i+1][j-1]=1;
                if(i-1>=0&&j+1<W) dp[i-1][j+1]=1;
                ans[i][j]='#';
            }
        }
    }

    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            //cout<<dp[i][j];
            if(dp[i][j]==0&&S[i][j]=='#'){
                cout<<"impossible"<<endl;
                return 0;
            }
        }
        //cout<<endl;
    }

    cout<<"possible"<<endl;
    for(int i=0;i<H;i++){
        for(int j=0;j<W;j++){
            cout<<ans[i][j];
        }
        cout<<endl;
    }
}

コメント

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