ferinの競プロ帳

競プロについてのメモ

ABC048に参加してみた

abc048.contest.atcoder.jp

A問題

 スライスを使って先頭の文字だけを取得して連結しました。

s = [i for i in input().split()]

ans = s[0][0:1] + s[1][0:1] + s[2][0:1]
print(ans)

B問題

 ans = b/x - a/x で求まります。aがxの倍数の時だけans++とすれば大丈夫(なはず)です。
 指数表記をint()で整数に直そうとしたんですが、下のように値が変化してしまい悩んでました。

>>> 1000000000000000000/3
3.333333333333333e+17
>>> int(1000000000000000000/3)
333333333333333312

 最終的に、C++で書いたら問題なさそうだったのでc++で提出しました。

C問題

 配列aを左から2つずつ区切っていったときにその2つのうち左側を優先的に減らす理由はないため、右側を優先的に減らしていく貪欲法で実装しました。

n, x = map(int, input().split())
a = [int(i) for i in input().split()]

count = 0
for i in range(n):
    s = sum(a[i:i+2])
    if s > x:
        if (s - x > a[i+1]):
            a[i+1] = 0
            a[i] -= (s - x - a[i+1])
        else:
            a[i+1] -= sum(a[i:i+2]) - x
        count += s - x

print(count)

D問題

 適当に入力例を紙に書いて試していたところ、ab???baのように真ん中に挟まれているところがあったとしても関係なさそうだと思いつき、両端の文字と文字列の長さが偶数か奇数かで判断すればよさそうだと思い浮かび、ちゃんと証明できていたわけではありませんがとりあえず提出したらACでした。

s = input()

if s[0:1] == s[len(s)-1:len(s)]:
    if len(s) % 2 == 1:
        print("Second")
    else:
        print("First")
else:
    if len(s) % 2 == 1:
        print("First")
    else:
        print("Second")

雑感

 Bで悩んでいた時間がすごいもったいなかったなと思いました。苦手なDPが出なかったこともあって4完できてよかったです。