AtCoder Beginner Contest 012(ABC012) 解説

ABC

A – スワップ

A - スワップ
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

文章通り、入力を逆転させて出力しましょう。

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

using namespace std;
using namespace atcoder;

int main(){
    int A,B;
    cin>>A>>B;
    cout<<B<<" "<<A<<endl;
}

B – 入浴時間

B - 入浴時間
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

秒数をhh:mm:ssに変換する問題。
hh:mm:ssから→秒数の変換は

ss+mm*60+hh*60*60

で出来ます。(1分は60秒、1時間は60分で、3600秒)
ここから秒数→hh:mm:ssへの変換は、

3600秒でhhになるため、hh=秒数/3600
60秒でmmになるが60分でhhになってしまうため、mm=秒数/60%60
60秒でmmになってしまうため、ss=秒数%60

といえる。

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

using namespace std;
using namespace atcoder;

int main(){
    int N;
    cin>>N;

    string h=("0"+to_string(N/(60*60)));
    string m=("0"+to_string(N/60%60));
    string s=("0"+to_string(N%60));
    cout<<h.substr(h.size()-2,2)<<":"<<m.substr(m.size()-2,2)<<":"<<s.substr(s.size()-2,2)<<endl;
}

左0埋めに関しては、Excel関数なんかでよく使われる手法を採用した。
左に”0″一文字を足して右2文字を取得することにより、
数字1文字の場合:”0″ + “2” -> “02” -> 02
数字2文字の場合:”0″ + “23” -> “023” -> “23”
と、2文字の場合は一番左の0が切り取られ、結果として左0詰めが実現できる。

C – 九九足し算

C - 九九足し算
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

入力例1より、2013の入力で12足りていないため、もし九九の答えを全て足せた場合2025になることが分かる。
そのため、この問題は2025-Nが答えとなる九九の式を出力すればよい。

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

using namespace std;
using namespace atcoder;

int main(){
    int N;
    cin>>N;

    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            int n=i*j;
            if(2025-n==N){
                cout<<i<<" x "<<j<<endl;
            }
        }
    }
}

ちなみに、九九の和は入力例から読み解かなくても計算でパッと解くことができます。

Σ(n=1から9まで)Σ(m=1から9まで) n*m

の式ですが、これは

Σ(n=1から9まで) n * Σ(m=1から9まで) m

と分解でき、Σの式は和の公式より

(1+9)*9/2=45

と分かるため、45*45=2025だと分かります。
この考え方、Atcoderで頻出の考え方だったりします。

D – バスと避けられない運命

D - バスと避けられない運命
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

各頂点への移動の最短時間の最大が、最小になるような頂点を選ぶ問題。
各頂点への移動とあり、O(N^3)がいけそうなのでワーシャル–フロイド法の出番です。

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

using namespace std;
using namespace atcoder;

int main(){
    int N,M;
    cin>>N>>M;

    int ans[N+1][N+1];

    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            if(i==j) ans[i][j]=0;
            else ans[i][j]=300*1000+1;
        }
    }

    for(int i=0;i<M;i++){
        int a,b,t;
        cin>>a>>b>>t;
        ans[a][b]=t;
        ans[b][a]=t;
    }

    for(int k=1;k<=N;k++){
        for(int i=1;i<=N;i++){
            for(int j=1;j<=N;j++){
                ans[i][j]=min(ans[i][j],ans[i][k]+ans[k][j]);
            }
        }
    }

    int mn=INT_MAX;
    for(int i=1;i<=N;i++){
        int mx=0;
        for(int j=1;j<=N;j++){
            mx=max(mx,ans[i][j]);
        }
        mn=min(mn,mx);
    }

    cout<<mn<<endl;
}

ワーシャル–フロイド法、久しぶりに書きましたが実装が簡単で良いですね。

コメント

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