初心者のプログラミング日記

プログラミング初心者の日記

プログラミングに関することを書いていきます。

ABC146(A,B)

A - Can't Wait for Holiday

https://atcoder.jp/contests/abc146/tasks/abc146_a
かかった時間 3分

List=["SUN","MON","TUE","WED","THU","FRI","SAT"]
S=str(input())
num=List.index(S)
print(7-num)

B - ROT N

https://atcoder.jp/contests/abc146/tasks/abc146_b
かかった時間 20分

List=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
print(len(List))
N=int(input())
S=list(map(str,input()))
ans=""
for i in S:
    num=List.index(i)
    ans+=List[(num+N)%26]
    
print(ans)

Zの次はAに戻らなければならないので配列の要素の数、今回は26で割ると先頭にもどるので、そのindexを使ってリストから取り出しています。

C - Buy an Integer

https://atcoder.jp/contests/abc146/tasks/abc146_c

A,B,X=map(int,input().split())

ans=0
for i in range(10**9):
    num=A*i+B*len(str(i))
    
    if num>X:
        break
    
    if num>ans:
        ans=i
        
print(ans)

最初は上記のコードでやっていたんでがタイムアウトしたため、調べて見たところ二分木探索というのを行うらしくやってみました。

A,B,X=map(int,input().split())

left=1
right=10**9
ans=0

while left<=right:
    mid=(left + right)// 2 
    #Xより小さい場合に探索範囲を右に変える
    if A*mid+B*len(str(mid))<=X:
        ans=mid
        left=mid+1
    #Xより大きい場合に探索範囲を左に変える
    else:
        right=mid-1
        
print(ans)

参考記事
https://codezine.jp/article/detail/12243

今回の問題は全体的に難しかったです。