AtCoder Beginner Contest 117

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

A - Entrance Examination

Python3

t,x=map(int,input().split())
print("{0:.10}".format(t/x))

問題文読んでサンプルのとおりに計算する。

B - Polygon

Python3

input()
l=[int(i) for i in input().split()]
print(["No","Yes"][max(l)<sum(l)-max(l)])

一番長い辺とその他全ての辺の長さをどうにか計算して判定。

C - Streamline

Python

n,m=map(int,input().split())
l=[int(i) for i in input().split()]
l.sort()
ans=[0]
for i in range(m-1):
    ans.append(l[i+1]-l[i])
ans.sort()
for i in range(n-1):
    if len(ans)==1: break
    ans.pop()
print(sum(ans))

とりあえずソートする。それぞれ隣との区間を求める。区間もソートする。使えるコマが一つ増えるごとに大きい区間を省略できる。大きい区間を省略した後の総和が解になる。

D - XXOR

Python

n,k=map(int,input().split())
a=[int(i) for i in input().split()]
d=[0]*41
t=[0]*41
p=2**40
x=0
y=1
ans=0
for i,j in enumerate(bin(k)[::-1]):
    if j=="b": break
    if j=="1": d[i]=1
 
for i in a:
    for j,k in enumerate(bin(i)[::-1]):
        if k=="b": break
        if k=="1": t[j]+=1
for i in range(40,-1,-1):
    if d[i]==1 and t[i]>n//2-(n+1)%2:
        y=0
    elif d[i]==1 and t[i]<=n//2:
        x+=p
    elif y==0 and t[i]<=n//2:
        x+=p
    p//=2
for i in a:
    ans+=x^i
print(ans)

Kを2進数にして1が立っている桁を調べておく。Aの数を全部1が立っている桁を調べて個数をカウントする。桁が大きい方から見る。
XをK以下にするためにはKより先に1は立てられない。Kだけで1が立つ桁が発生したら後は自由。Kの以降の桁が全て0、Xの以降の桁が全て1でもXは必ずKより小さくなる。
Xで1を立てたいのはAで数えた中で1が立ってる個数がn/2より少ないもの。個数がn/2ぴったりのときは立てても立てなくてもXORで出てくる数は変わらないのですけど、XをK以下にする条件に不利になるので立てない方針でいいと思います。