roiti46's blog

主に競プロ問題の解説を載せてます

Atcoder Beginner Contest #010

ABC過去問解きその5。Cまでは易しい問題セット。けどD問題は最小カットを使うフロー問題。そんなの解けません。問題はこちら

A:

与えられた文字列の後ろに"pp"を加えて出力する問題。

print raw_input()+"pp"

B:

n 輪の花のそれぞれの花びらの枚数が与えられる。花占いをしていきたいのが、占い方には「好き➞嫌い➞好き」と「好き➞嫌い➞大好き」の2つのパターンがある。どちらのパターンでも嫌いが出ないように、はじめに花びらを何枚かちぎって調節したい。ちぎるべき花びらの合計枚数の最小値を答える問題。

2で割ったあまりと3で割った余りで条件を満たすかどうかを判断できるので、条件に合うまで花びらを一枚ずつちぎっていけばいい。

n = int(raw_input())
a = map(int,raw_input().split())
ans = 0
for i in a:
    while i%2 == 0 or i%3 == 2:
        i -= 1
        ans += 1
print ans

C:

スタート地点 (xa,ya)とゴール地点 (xb,yb)、さらにスタートからゴールまでの移動にかけられる時間 T と移動速度 V が与えられる。N 個の 点(x,y) が与えられるので、1つでもその点を経由して T 時間以内にゴールに到達できるものがあれば "YES" と答え、なければ "NO" と答える問題。

やるだけなのだが、距離を求めるのに√を使っているので、誤差に気をつけないといけない。幸い、今回の条件ではそういったきわどいケースは存在しないので気にしなくても済んだ。

def S(x1,y1,x2,y2):
    return ((x2-x1)**2 + (y2-y1)**2)**0.5
 
xa,ya,xb,yb,T,V = map(int,raw_input().split())
n = int(raw_input())
for roop in range(n):
    x,y = map(int,raw_input().split())
    if S(xa,ya,x,y)+S(x,y,xb,yb) <= T*V:
        print "YES"
        break
else:
    print "NO"

D:

解法がいまだ理解できていない