AtCoder Beginner Contest 094/AtCoder Regular Contest 095

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

A - Cats and Dogs

Python3

a,b,x=map(int,input().split())
print("YES" if x>=a and x<=a+b else "NO")

既にいるA匹の猫とB匹の何かをよしなにしてちょうどX匹に出来るかを確認しました。

B - Toll Gates

Python3

n,m,x=map(int,input().split())
a=[int(i) for i in input().split()]
ans=chk=0
for i in a:
    if i<x: ans+=1
    else: chk+=1
print(min(ans,chk))

xから0に行くのと、Nに行くをの両方調べてコストが安いほうが解になる。別々に計算しないでも数列aを先頭から確認すれば大丈夫そう。

C - Traveling Plan

Python3

n=int(input())
x=[int(i) for i in input().split()]
if n==2:
    for i in x[::-1]:
        print(i)
    exit()
 
d={}
y=sorted(x)
ans={}
for a,i in enumerate(y):
    if a<n//2:
        if i not in ans:
            ans[i]=y[n//2]
    elif a>=n//2:
        if i not in ans:
            ans[i]=y[n//2-1]

for i in x:
    print(ans[i])

今回の解法ではNが2の場合だけ例外にした。力押しで解決するのに元々の数列Xの順序を壊してしまうので、y=sorted(x)しました。sortedはかなり久しぶりにつかいました。普段は気にせずというか再利用することもないのでx.sort()でえいやっなんですけど。

D - Binomial Coefficients

PyPy3

n=int(input())
a=[int(i) for i in input().split()]
a.sort()
x=a[-1]
ans=[x,0]
for i in a:
    if x>i and abs(x//2-i)<abs(x//2-ans[1]):
        ans[1]=i
    if x>i and x%2 and abs((x+1)//2-i)<abs((x+1)//2-ans[1]):
        ans[1]=i
 
print(ans[0],ans[1])

comb(n,r)が大きくなるためにはnがより大きくて、rはnの1/2に近い数の方がいいはずです。なのでnは数列aの中で最大の数に決めて、rは数列aの中の全部から探しても間に合いそうだったので全部調べました。数列aの制限を見た感じではcomb(n,r)を計算しようとはしないほうがいい気がします。