AtCoder Beginner Contest 092

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

A - Traveling Budget

Python3

a=int(input())
b=int(input())
c=int(input())
d=int(input())
print(min(a,b)+min(c,d))

A,BとC,Dのそれぞれ安い方を選べば大丈夫。

B - Chocolate

PyPy3

n=int(input())
d,x=map(int,input().split())
for i in range(n):
    a=int(input())
    x+=(d+a-1)//a
print(x)

N人の参加者はそれぞれA日おきに1つずつ食べる。D日間でA日おきに食べる。割り算で端数繰り上げで大丈夫な気がします。

C - Traveling Plan

PyPy3

n=int(input())
a=[int(i) for i in input().split()]
ans=chk=0
for i in a:
    ans+=abs(chk-i)
    chk=i
ans+=abs(a[-1])
for i in range(n):
    x=ans
    if i==0:
        x-=abs(a[0])
        x-=abs(a[0]-a[1])
        x+=abs(a[1])
    elif i==n-1:
        x-=abs(a[-1])
        x-=abs(a[-1]-a[-2])
        x+=abs(a[-2])
    else:
        x-=abs(a[i-1]-a[i])
        x-=abs(a[i+1]-a[i])
        x+=abs(a[i-1]-a[i+1])
    print(x)

過去の提出では毎回全部座標0から計算してました。今回は全体を計算しておいて取り止めた座標のトコだけ調節するようにしました。実行時間はあまり変わらなかったようです。

D - Grid Components

PyPy3

a,b=map(int,input().split())
ans=[["#"]*100 for i in range(50)]
for i in range(50):
    ans.append(["."]*100)
 
for i in range(0,49,2):
    for j in range(0,100,2):
        if a==1:
            break
        ans[i][j]="."
        a-=1
    if a==1:
        break
 
for i in range(51,100,2):
    for j in range(0,100,2):
        if b==1:
            break
        ans[i][j]="#"
        b-=1
    if b==1:
        break
print(100,100)
for i in ans:
    print("".join(i))

なんとなくは考えたのですけども詰め切れずに解説を読んでAC。白黒を交互に使えば〜は個数差が2個以上でダメ。100x100を全部黒(白)にしておいて白(黒)を1つ間隔で置けば〜は片方だけ置いてもう一方の個数が全然ダメでダメでした。
よく問題を読んでよく制限を確認するべきでした。
100x100を上半分と下半分で白黒に塗り分けます。5000マスずつの領域が出来ますね。白の領域には黒を、黒の領域には白を指定の連結成分の個数-1ずつ置きます。上下左右斜めで隣接しないように置いても1つごとに4マスあれば(だと思います)なので最大個数500に対しても余裕ありで作成できるはずです。

縮小した作成イメージ、これを実際には100x100で行います

####
####
####
####
....
....
....
....

↓

.#.#
####
.###
####
....
#.#.
....
....

E問題以降のARC分はいつかそのうちに