金魚亭日常

読書,ガジェット,競技プログラミング

Codeforces Round #580 Div2

最近は codeforces にも頑張って出ているが,こちらも出るたびにratingが下がっていく…

しかし,codeforces 出ると AtCoder は使いやすいなぁと思う.

Cまで開けたが,わからんかった.

A. Choose Two Numbers

普通に総当たり

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))
 
 
def solve():
    for i in range(n):
        for j in range(m):
            if (a[i] + b[j] not in a) and (a[i] + b[j] not in b):
                print(a[i], b[j])
                return
 
 
solve()

https://codeforces.com/contest/1206/submission/59005861

B. Make Product Equal One

1 か -1 の近いほうにして, -1 にするのが奇数個だったら, -1 => 1 or 1 => -1 のコストが小さいほうを変更する. 解説では 0を基準にしていた. もっとすっきり書けた気がする.

n = int(input())
a = list(map(int, input().split()))
neg = []
pos = []
 
for aa in a:
    if abs(1 - aa) < abs(-1 - aa):
        pos.append(aa)
    else:
        neg.append(aa)
 
ans = 0
if len(neg) % 2 != 0:
    if len(pos) == 0:
        d = 0
        cost = 10**9 + 1
        for aa in neg:
            if cost > abs(1 - aa) - abs(-1 - aa):
                cost = abs(1 - aa) - abs(-1 - aa)
                d = aa
        ans += sum([abs(-1 - x) for x in neg])
        ans -= abs(-1 - d)
        ans += abs(1 - d)
    else:
        d1 = 0
        cost1 = 10**9 + 1
        for aa in neg:
            if cost1 > abs(1 - aa) - abs(-1 - aa):
                cost1 = abs(1 - aa) - abs(-1 - aa)
                d1 = aa
        d2 = 0
        cost2 = 10**9 + 1
        for aa in pos:
            if cost2 > abs(-1 - aa) - abs(1 - aa):
                cost2 = abs(-1 - aa) - abs(1 - aa)
                d2 = aa
 
        ans += sum([abs(1 - x) for x in pos])
        ans += sum([abs(-1 - x) for x in neg])
        if cost1 < cost2:
            ans -= abs(-1 - d1)
            ans += abs(1 - d1)
        else:
            ans -= abs(1 - d2)
            ans += abs(-1 - d2)
else:
    ans += sum([abs(1 - x) for x in pos])
    ans += sum([abs(-1 - x) for x in neg])
 
print(ans)

https://codeforces.com/contest/1206/submission/59026990