AtCoder Beginner Contest 001(ABC001) 解説

ABC

Experimental Estimateといえど、atcoder problemsの色が水-水-水-青なの面白い。
眠たいし、アレな回なので真面目な解説はしません。(ごめんなさい)

A – 積雪深差

A - 積雪深差
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

H1−H2 の値を計算して出力してください。という問題。
入出力と四則演算が分かれば解けますね。

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

using namespace std;
//using namespace atcoder;

int main(){
    int H1,H2;
    cin>>H1>>H2;
    cout<<H1-H2<<endl;
}

B – 視程の通報

B - 視程の通報
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

問題文がややこしいですが、ABC001のB,C問題はこんな感じです。
設計書からの実装を意識したとかどうとか…。
頑張って読んでね!としか言いようがないです。

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

using namespace std;
//using namespace atcoder;

int main(){
    int m;
    cin>>m;
    int v;
    if(m<100) v=0;
    else if(m<=5000) v=m/100;
    else if(m<=30000) v=m/1000+50;
    else if(m<=70000) v=(m/1000-30)/5+80;
    else v=89;

    if(v/10==0) cout<<"0";
    cout<<v<<endl;
}

C – 風力観測

C - 風力観測
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

7WAしたのは内緒。
浮動小数同士の比較は誤差死しやすいです。
最終的に整数のみで比較できるよう変換しました。

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

using namespace std;
//using namespace atcoder;

int main(){
    int D,W;
    cin>>D>>W;
    string hou;
    int tuy;


    if(D<113) hou="N";
    else if(D<338) hou="NNE";
    else if(D<563) hou="NE";
    else if(D<788) hou="ENE";
    else if(D<1013) hou="E";
    else if(D<1238) hou="ESE";
    else if(D<1463) hou="SE";
    else if(D<1688) hou="SSE";
    else if(D<1913) hou="S";
    else if(D<2138) hou="SSW";
    else if(D<2363) hou="SW";
    else if(D<2588) hou="WSW";
    else if(D<2813) hou="W";
    else if(D<3038) hou="WNW";
    else if(D<3263) hou="NW";
    else if(D<3488) hou="NNW";
    else hou="N";

    if(W<2*6+3) tuy=0;
    else if(W<15*6+3) tuy=1;
    else if(W<33*6+3) tuy=2;
    else if(W<54*6+3) tuy=3;
    else if(W<79*6+3) tuy=4;
    else if(W<107*6+3) tuy=5;
    else if(W<138*6+3) tuy=6;
    else if(W<171*6+3) tuy=7;
    else if(W<207*6+3) tuy=8;
    else if(W<244*6+3) tuy=9;
    else if(W<284*6+3) tuy=10;
    else if(W<326*6+3) tuy=11;
    else tuy=12;

    if(tuy==0) hou="C";

    cout<<hou<<" "<<tuy<<endl;
}

風力は*10を四捨五入。風速は*60に、+3は切り捨て分です。
無駄に条件や式がややこしくなった気がします。

D – 感雨時刻の整理

D - 感雨時刻の整理
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

いもすっぽいですが、制約よわよわなので何も考えなくてOKです。
愚直に実装しましょう。

入出力がhhmm-hhmmだったりと、罠や面倒っぽい所が多いです。
入力例と出力例が合わないときは、もう一度じっくり読んだほうが良いです。(というのも、入力を5分単位で丸める仕様を見落としてハマってました。)

#include<bits/stdc++.h>

using namespace std;

int main(){
    int N;
    int f[60*24+60]={0};

    cin>>N;
    for(int i=0;i<N;i++){
        string S;
        cin>>S;
        int sm=stoi(S.substr(0,2));
        int ss=stoi(S.substr(2,2));
        int em=stoi(S.substr(5,2));
        int es=stoi(S.substr(7,2));
        while(ss%5!=0) ss--;
        while(es%5!=0){
            es++;
            if(es==60){
                es=0;
                em++;
            }
        }
        //cout<<sm<<","<<ss<<","<<em<<','<<es<<endl;
        int s=sm*60+ss;
        int e=em*60+es;
        for(int j=s;j<=e;j++) f[j]=1;
    }

    for(int i=0;i<60*24+60;i++){
        if(f[i]){
            for(int j=i+1;j<60*24+60;j++){
                if(!f[j]){
                    int sm=i/60;
                    int ss=i%60;
                    int em=(j-1)/60;
                    int es=(j-1)%60;
                    if(sm<10) cout<<"0";
                    cout<<sm;
                    if(ss<10) cout<<"0";
                    cout<<ss;
                    cout<<"-";
                    if(em<10) cout<<"0";
                    cout<<em;
                    if(es<10) cout<<"0";
                    cout<<es;
                    cout<<endl;
                    i=j;
                    break;
                }
            }
        }
    }

}

おわりに

大学の課題を思い出しました。

コメント

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