三井住友信託銀行プログラミングコンテスト2019
はい。
https://atcoder.jp/contests/sumitrust2019
oooo-x 924(+15)でした。
A - November 30
PyPy3
m,d=map(int,input().split()) n,k=map(int,input().split()) print(1 if (m in [1,3,5,7,8,10,12] and d==31) or (m in [4,6,9,11] and d==30) or (m==2 and d==28) else 0)
本気で1日目が月末日かを確認しました。後から気づいたんですけど2日目が1なら即判定できましたね。
B - Tax Rate
PyPy3
n=int(input()) for i in range(1,60000): x=(i*108)//100 if x==n: print(i) exit() print(":(")
実数を使ってintでキャストするのは信用して良いのかわかっておりません。わからないので確実に切り捨てになるはずの方法で計算しました。
C - 100 to 105
PyPy3
n=int(input()) x=n//100 y=n%100 print(1 if y<=x*5 else 0)
100円で割った結果を買い物個数として考えました。、端数は5円×個数以下なら調整できるはずなので買い物可能と判定しました。
D - Lucky PIN
PyPy3
n=int(input()) s=input() d=[set([]) for i in range(10)] for i in range(n): x=int(s[i]) d[x].add(i) ans=0 for i in range(1000): a=b=c=-1 x=i//100 y=(i%100)//10 z=i%10 if len(d[x])>0: a=min(d[x]) if len(d[z])>0: c=max(d[z]) if a!=-1 and c!=-1: for j in range(a+1,c): if j in d[y]: ans+=1 break print(ans)
もう少し単純に書けると思います。というかこれTLE心配したのですがACしてしまったのです。あとそれぞれの数字が何番目にあるかをsetに放り込んでいるんですがlistの方がよかった気がします。
listなら昇順になっているので先頭と末尾を見れば何番目にあるかのmin,maxが分かったり、真ん中の数を探すのも楽っぽい気がします。
解いた方針としては000から999が作成可能であるかを調べることにしました。左から1桁目は登場するmin番目を想定します。3桁目はmax番目を想定します。2桁目はその範囲内にあるかを調べます。
例えばサンプル2で112が作成可能であるかを調べるときには、
1桁目にする数:左から1桁目の1
2桁目にする数:あとで調べる
3桁目にする数:左から5桁目の2
とします。その1桁目−5桁目の間に2桁目に使用する数があるかを探す感じにしました。
2桁目を range(a+1,c)
とかするのかなり効率悪くて入力のSが 0123456789000...0123456789
みたいなテストケースあったら無理そうな気がします。 10以下から29990以下の範囲を1000回探索は無理っぽい気がするのですがテストケースがわからないのでなんともです。