AtCoder Beginner Contest 029
はい。 ooox
https://atcoder.jp/contests/abc029
当時はリアタイで参加していたようです。Python2のコードが放置されていたので書き直しました。
A - 複数形
PyPy3
print(input()+"s")
はい。単純に末尾にsを付け足すものでした。
B - カキ
PyPy3
ans=0 for i in range(12): s=input() if 'r' in s: ans+=1 print(ans)
各行の文字列にrが何個あるかは知る必要がないので、rを含んでいるかのみを確認すれば大丈夫だと思う。
C - Brute-force Attack
PyPy3(itertools使用)
import itertools n=int(input()) w=list(itertools.product("abc",repeat=n)) ans=[] for i in w: ans.append("".join(i)) ans.sort() for i in ans: print(i)
PyPy3()
def sol(a,b): if a==0: print(b) else: for i in "abc": sol(a-1,b+i) n=int(input()) sol(n,"")
itertools.productを使ったり再帰で書いたり。両方出来る知ってるほうがいいと思います。。
D - 1
PyPy3
記憶にないので提出した状況が詳細不明です。
n=int(input()) d=0 for i in range(11): d+=[0,1][n//(10**i)>0] ans=0 for i in range(1,d+1): a=(n//pow(10,i))*pow(10,i-1) b=n%pow(10,i) if (b>=2 * pow(10,i-1)): b=pow(10,i-1) elif (b<pow(10,i-1)): b=0 else: b=b-pow(10,i-1)+1 ans+=a+b print(ans)
なんとか桁DPでやり直し
n=input() l=[int(i) for i in "0"+n] dp=[[[0]*12,[0]*12] for _ in "ww"] dp[0][0][0]=1 for i,j in enumerate(l): if i==0: continue for k in range(11): if dp[i%2-1][0][k]: dp[i%2][0][k+(j==1)]=1 dp[i%2][1][k+1]+=(j>1) dp[i%2][1][k]+=[[1,j-1][j>1],0][j==0] if dp[i%2-1][1][k]: dp[i%2][1][k+1]+=dp[i%2-1][1][k] dp[i%2][1][k]+=dp[i%2-1][1][k]*9 for k in range(24): dp[i%2-1][k//12][k%12]=0 ans=0 for i in range(4): for j in range(1,12): ans+=dp[i//2][i%2][j]*j print(ans)
不明の方は不明です。
あと想定解が桁DPではないらしいです。1の出現する周期、連続でいくつあるかとかに注目するらしいです。よく分かりません。
桁DPするならNが最大で109らしいです。少し余裕をもって配列用意して桁DP。少し慣れてきた気がします。