AtCoder Beginner Contest 085

はい。
https://atcoder.jp/contests/abc085

A - Already 2018

Python3

print(input().replace('2017','2018'))

2017/1/17とかに影響されないようにごっそりと置換した。。

B - Kagami Mochi

Pyhthon3

n=int(input())
ans=set([])
for i in range(n):
    ans.add(int(input()))
print(len(ans))

大きさが何種類あるかをみればいいと思うのでset型に放り込んだ。。。

C - Otoshidama

Pyhthon3

def chk(l):
    return l[0]*10+l[1]*5+l[2]
 
n,y=[int(x) for x in input().split()]
y//=1000
n-=y%5
ans=[0,n,y%5]
t=n*2
while t>=0:
    t-=1
    if y==chk(ans):
        break
    elif y>chk(ans) and ans[1]>0:
        ans[1]-=1
        ans[0]+=1
    elif y<chk(ans) and ans[1]>4:
        ans[1]-=5
        ans[2]+=5
    elif y>chk(ans) and ans[2]>0:
        ans[2]-=1
        ans[0]+=1
    elif y<chk(ans) and ans[0]>4:
        ans[0]-=5
        ans[2]+=5
        
if y==chk(ans):
    print(*ans)
else:
    print("-1 -1 -1")

もっと省略できるはず。。。百の位以降は使わないので使わないことにした。5で割り切れない端数の円は1000円札使うこと固定になるはずなので端数分は先に除外した。そのあとは一旦は全て5000円札扱いにした。それから金額が足りてなければ1枚ずつ10000円札に、金額が余ったら5枚ずつ1000円札に交換なイメージで適当にうだうだ交換を何回も提出した。。 というかそもそも最初の方で1000円札と10000円札が入れ違ってることに気づいてなかったのがダメなんですけど。。

D - Katana Thrower

Python3

n,h=map(int,input().split())
a=[]
b=[]
for i in range(n):
    x,y=map(int,input().split())
    a.append(x)
    b.append(y)
a.sort()
b.sort()
chk=max(a)
ans=0
for i in b[::-1]:
    if (h<=0 or i<chk): break
    ans+=1
    h-=i
if h>0:
    ans+=(h+chk-1)//chk
 
print(ans)

aポイントのダメージを与える攻撃は使うとしたら全部の武器の中で最大値のものだけ。但し、aの最大値より大きいbを使って倒せる場合はaを使わなかったりする。
(攻撃の順番に意味はないので)
・(aの最大値より大きい)bを投げつけるだけで倒す場合。
・(aの最大値より大きい)bを投げつけて、残りはaの最大値だけ殴って倒す場合。
・強いbがないので、ひたすらaの最大値だけで殴って倒す場合。
すごい大雑把にはこの3パターンしかない気がします。使えるbだけ使った後に、倒していなかったらaとの商の端数ある場合は繰り上がりした回数が解になる。はず。