三井住友信託銀行プログラミングコンテスト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回探索は無理っぽい気がするのですがテストケースがわからないのでなんともです。