セイレンチュウ..

AtCoder ABC133

概要

AtCoderの記録です。全部Pythonで頑張ります。
E,Fは解いてないです。

この記事の対象

  • AtCoderについてある程度知っている人
  • Pythonがある程度読める人



本編

AtCoderとは

競技プログラミングコンテストを開催している会社です。 atcoder.jp

ABC133

現代制御の勉強中に線形代数のわかってなさが露見して焦ってますが、参加します。

A T or T

f:id:alumi-tan:20190707231122p:plain

う〜〜〜ティ〜〜!!ティー!ティティー!ティッティッティティー!TT兄弟だ!!

N,A,B = map(int,input().split())
if N*A > B:
  print(B)
else:
  print(N*A)

B Good Distance

f:id:alumi-tan:20190707231352p:plain

見通しは良いが少し手間に感じた。

import math
N,D = map(int,input().split())
 
l = []
for i in range(N):
    data = list(map(int,input().split()))
    l.append(data)
 
def dist(a,b):
    cnt = 0
    for i in range(len(a)):
        cnt += (a[i]-b[i])**2
    return math.sqrt(cnt)
 
ans = 0
for i in range(N):
    for j in range(i+1,N):
        if dist(l[i],l[j])%1 == 0:
            ans += 1
 
print(ans)

C Remainder Minimization 2019

f:id:alumi-tan:20190707231533p:plain

いや〜。これに今回は少し手こずってしまった。大失敗。
2019=3×667だな、とか考える必要なかった。
LとRの差が2019以上ある場合は必ず2019の倍数を取れるので余りは0で、それ以外の時は全探索で行ける。

L,R = map(int,input().split())
 
if R-L >= 2019:
    ans = 0
else:
    ans = 4000
    for i in range(L,R+1):
        for j in range(i+1,R+1):
            p = ((i%2019) * (j%2019))%2019
            if p < ans:
                ans = p
 
print(ans)

D Rain Flows into Dams

f:id:alumi-tan:20190707231833p:plain

今回も数学の問題ですね。
山iに降る雨の量を2x_iとして、x_1~x_nまでのn元連立方程式をうまく解け、という問題です。
係数行列を行階段形に直す操作を考えていくと気づきますが、x_1に注目すると、最終的に2x_1=A_1-A_2+A_3-A_4+…+A_N(Nが奇数のため最後は+)という式が導けます。
x_1が求められると、芋づる式にx_2,x_3,…と求めていけます。

N = int(input())
A = list(map(int,input().split()))

x = [0 for i in range(N)]

cnt = 0
for i in range(N):
    if i % 2 == 0:
        cnt += A[i]
    else:
        cnt -= A[i]
x[0] = cnt

for i in range(1,N-1):
    x[i] = (A[i-1]-x[i-1]/2)*2

L = [str(int(i)) for i in x]
print(' '.join(L))

まとめ

今回は緑コーダーデビューするぞ!と思っていましたが、ギリギリできませんでした。悲しい。
Dは数学の問題で一発で通せたのですが、Cで謎に手間取って3WAを出したのが敗因ですね。次回こそデビューします。あと院試の勉強も頑張ります。

f:id:alumi-tan:20190707232325p:plain