今週のAtCoder問題の振り返り.後にD問題を追加する.
#目次
[1. A-Signed Difficulty](#1-A-Signed Difficulty)
[2. B-Same Name](#2-B-Same Name)
[3. C-Many Balls](#3-Many Balls)
4. 参考
#1. A-Signed Difficulty
問題
実数,$X, Y$が与えられ以下のように出力する
- $0 \le Y \le 2$ならば,$ X- $
- $3 \le Y \le 6$ならば,$ X $
- $7 \le Y \le 9$ならば,$ X- $
制約
- $ 1 \le X \le 15$
- $0 \le Y \le 9$
- $X, Y$は整数
解答
x, y = map(int, input().split('.'))
if 0 <= y <= 2:
print('{}-'.format(x))
elif 3 <= y <= 6:
print('{}'.format(x))
elif 7 <= y <= 9:
print('{}+'.format(x))
#2. B-Same Name
問題
$N$人の人がいます.$i(1 \le i \le N)$人目の人の姓は$S_i$,名は$T_i$である.
同姓同名が存在するか答えなさい.
制約
- $2 \le N \le 1000$
- $N$は整数
- $S_i, T_i$は英小文字からのみなる長さ$1$以上$10$以下の文字列
ポイント
姓と名を別々に考える必要なはいので,全く同じ文字列かどうかだけ判断.
解答
def has_duplicates(seq):
if len(seq) != len(set(seq)):
return 'Yes'
else:
return 'No'
n = int(input())
name_list = []
for _ in range(n):
name_list.append(input())
print(has_duplicates(name_list))
#3. C-Many Balls
問題
空の箱がある.以下の2種類の操作を行うことが可能である.
- $A$: 箱の中のポールを$1$つ増やす
- $B$: 箱の中のボールの数を$2$倍にする
合計$120$回以内で箱の中のボールの数をちょうど$N$にする方法を$1$つ考えよ.
制約
- $1 \le N \le 10^{18}$
- 入力は全て整数
ポイント
増やす行為も減らす行為も全く一緒と考えられる.なので,減らしていくことを考える.
次に,$120$回以内で抑えるためには$B$の操作を効率よく行うことが必要である.具体的には,2で割れるときには,操作$B$を行い,2で割れない時は操作$A$を行う.
解答
n = int(input())
# A or Bの操作を格納
call_list = []
while n >= 1:
# 2で割れたら操作B
if n % 2 == 0:
n = n // 2
call_list.append('B')
# 2で割れなかったら操作A
if n % 2 == 1:
n = n - 1
call_list.append('A')
# 答えるときは逆順
call_list.reverse()
# joinして文字列に
call = ''.join(call_list)
print(call)
#4. 参考
AtCoder