0
1

More than 3 years have passed since last update.

AtCoder Beginner Contest 216 (A~C)

Posted at

今週のAtCoder問題の振り返り.後にD問題を追加する.

目次

1. A-Signed Difficulty
2. B-Same Name
3. C-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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1