AtCoder Beginner Contest 001
はい。
https://atcoder.jp/contests/abc001
A - 積雪深差
PyPy3
print(int(input())-int(input()))
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int h1,h2; scanf("%d %d",&h1,&h2); printf("%d\n",h1-h2); return 0; }
2つ受取と引き算です。Pythonが変数に代入せずにinput並べて大丈夫なこと忘れてました。C++が半角スペースか改行区切りかとかにあまり影響を受けないことを知りませんでした。
B - 視程の通報
PyPy3
m=int(input()) if m<100: print("00"); elif m<=5000: print("{0:02}".format(m//100)) elif m<=30000: print(m//1000+50) elif m<=70000: print((m//1000-30)//5+80) else: print(89)
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int m,ans; scanf("%d",&m); if (m<100) ans=0; else if (m<=5000) ans=m/100; else if (m<=30000) ans=m/1000+50; else if (m<=70000) ans=(m-30000)/5000+80; else ans=89; printf("%02d\n",ans); return 0; }
問題文をよく読んで丁寧に分岐を書きます。
C - 風力観測
PyPy3
news=['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSW','SW','WSW','W','WNW','NW','NNW'] g,s=map(int,input().split()) r=news[((g*10+1125)%36000)//2250] s=s*10//6 if s<=24: w=0 elif s<=154: w=1 elif s<=334: w=2 elif s<=544: w=3 elif s<=794: w=4 elif s<=1074: w=5 elif s<=1384: w=6 elif s<=1714: w=7 elif s<=2074: w=8 elif s<=2444: w=9 elif s<=2844: w=10 elif s<=3264: w=11 else: w=12 if w==0: r="C" print(r,w)
C++14
#include<bits/stdc++.h> using namespace std; vector<string> news={"N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW","C"}; int main(){ int g,s,t; scanf("%d %d",&g,&s); g=(g*10+1125)%36000; s=(s*10)/6; if (s<25) t=0; else if (s<155) t=1; else if (s<335) t=2; else if (s<545) t=3; else if (s<795) t=4; else if (s<1075) t=5; else if (s<1385) t=6; else if (s<1715) t=7; else if (s<2075) t=8; else if (s<2445) t=9; else if (s<2845) t=10; else if (s<3265) t=11; else t=12; if (t==0) g=37125; cout << news[g/2250] << " " << t << endl; return 0; }
分岐を丁寧に。誤差出る出ないを信用しなかったので桁を大きくして整数の範囲で計算するようにしました。360度回ると0度になることを忘れないように。どんな数を四捨五入すると10.5になるのかとかも考えるように。
D - 感雨時刻の整理
PyPy3
n=int(input()) d=[] for i in range(n): a,b=map(str,input().split("-")) ah=int(a[:2]) am=int(a[2:]) bh=int(b[:2]) bm=int(b[2:]) am-=am%5 if bm%5: bm+=(5-bm%5) if bm==60: bh+=1 bm=0 d.append((3600*ah+am,3600*bh+bm)) d.sort() ans=[[d[0][0],d[0][1]]] for i in range(1,n): if d[i][0]<=ans[-1][1]: ans[-1][1]=max(ans[-1][1],d[i][1]) else: ans.append([d[i][0],d[i][1]]) for i in ans: print("".join(["{0:02}".format(i[0]//3600),"{0:02}".format(i[0]%3600),"-","{0:02}".format(i[1]//3600),"{0:02}".format(i[1]%3600)]))
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int n,p=0; int w[1450]; for (int i=0;i<1450;i++) w[i]=0; scanf("%d",&n); for (int i=0;i<n;i++) { int a,b,s,g; scanf("%d-%d",&a,&b); s=a/100*60+a%100; g=b/100*60+b%100; s-=s%5; g=g+(g%5>0?5-g%5:0); w[s]+=1; w[g]-=1; } for(int i=0;i<1450;i++) { if(p==0 && w[i]>0) { printf("%04d-",i/60*100+i%60); } else if(p>0 && p+w[i]==0) { printf("%04d\n",i/60*100+i%60); } p+=w[i]; } return 0; }
Pythonの方はちょっと書き間違えて3600で掛け算とかしてます。ACは出てますけど。。本当にやりたかったのはC++で書いているようなほうのことです4桁のhhmmを hh*60 + mm
とかしてしまえば計算しやすいのではないかなー、と思います。降り始め降り終わりをくっつけるのに hhmm を意識しなくていいのはかなり楽だと思います。 hhmm への復元も簡単ですし。60分24時間の配列を初期値0で用意しておいて降り始めで+1して、降り終わりで-1しておく。全ての入力を受取と処理が終わったら配列を先頭から見て累積和を取っていく0の時に+が発生したら降り始め。追加で+があったら加算だけして配列を見ていく。 -が発生して累積和で値が0になったら降り終わりの時間〜を24時間見ます。