Port 53

明日のための技術メモ

AtCoder ABC161

AtCoder ABC161解いた分だけまとめ。
今回はABC3完。Cでペナルティ叩きまくって爆死。
数学系の問題に手こずっている今日このごろ。

目次

A. ABC Swap

問題文 f:id:saturn-glave:20200405131120p:plain

問題文通りに実装する。変数初期化の時点で最初の入れ変えをした。

ACしたコード

#coding:utf-8
x,y,z = map(int, input().split())

#step1
a = y
b = x
c = z

#step2

a = z
c = y

print(a, b, c)

B. Popular Vote

問題文 f:id:saturn-glave:20200405131313p:plain

少し問題文読み間違えていて、WA出してしまった。 全商品を降順に並べ替えて、ひとつずつそれが登録できる票数を
持っているか精査し、登録数mに達した時点で処理を抜ける。

ACしたコード

#coding:utf-8
import sys
n, m = map(int, input().split())
a = list(map(int, input().split()))
vote = sum(a)
rank = sorted(a, reverse=True)
border = vote / (4*m)
#print(border, rank)
count = 0

for i in range(0, n):
    if rank[i] >= border:
        count += 1

    if count == m:
        print('Yes')
        sys.exit()

print('No')

C. Replacing Integere

問題文 f:id:saturn-glave:20200405131642p:plain

いちいち検証する処理を書くわけにはいかないので、サンプルから推察する。
それ以外にも、色々と紙に偶数・奇数などパターンを書き出していって、
以下の場合分けに落ち着いた。

まず、n<kの時は強制的に、nか|n-k|のどちらか小さい方に帰結する。
k=1かn=0、あるいはnがkの倍数の時は、最後0になる。
それ以外は、nをkで割った時の余りか、そこからさらにkを引いた絶対値のうち小さい方になる。

ACしたコード

#coding:utf-8
import math
n, k = map(int, input().split())

if n < k:
    print(min(n, abs(n-k)))
elif k == 1 or n == 0 or n%k == 0:
    print(0)
elif n%k != 0:
    print(min(abs(n%k-k), n%k))