1
0

More than 1 year has passed since last update.

AtCoder ABC224 挑戦!(Python)

Last updated at Posted at 2021-10-23

ABC224、コンテスト6回目の挑戦です。
阪神が点が取れず引き分けだったのと同じく、私もC問題で最後WAを取り除けずに、落としました。。。
でも茶色(優勝)は諦めません。挑戦しつづけるのみ。諦めたらそこで試合終了。

ABC224A
S=input()

#erかistかを判定
if S[-2:]=='er':
    print('er')
else:
    print('ist')

必ずどっちかに判定されるので、istの方は節約した。

ABC224B
H, W= map(int, input().split())
# print(H, W)

#H行W列のマス目
matrix=[]
for i in range(H):
    index_i=[]
    index_i=list(map(int, input().split()))
    matrix.append(index_i)

# print(matrix)

#条件の判定
#ありうるi1, i2の組み合わせ
list_i1_i2=[]
for i1 in range(1,H+1):
    for i2 in range(1, H+1):
        if i1 <i2:
            list_i1_i2.append([i1, i2])
        else:
            pass
# print(list_i1_i2)

#ありうるj1, j2の組み合わせも同様に
list_j1_j2=[]
for j1 in range(1,W+1):
    for j2 in range(1, W+1):
        if j1 <j2:
            list_j1_j2.append([j1, j2])
        else:
            pass
# print(list_j1_j2)

#i1, i2, j1, j2についてそれぞれ判定して結果を出力
flag='Yes' #判定のフラグ
for i in list_i1_i2:
    i1=i[0]
    i2=i[1]
    for j in list_j1_j2:
        j1=j[0]
        j2=j[1]

        #条件式の判定
        #値指定が0始まりなので、-1
        if matrix[i1-1][j1-1]+matrix[i2-1][j2-1]<=matrix[i2-1][j1-1]+matrix[i1-1][j2-1]:
            pass
        else:
            flag='No'
            break
print(flag)

速さもレートに反映されるとわかったので、ABはできるだけ速く解くことを意識して臨んだが、問題文がわかりにくく、オエっとなった。
ついにBも完答できない回が来たかと悟ったが、よく考えると、ただ判定すればいいだけだった。でもいろいろあって、時間はかかって、40分くらい。

ABC224C_一部WA
N=int(input())

list_i=[]
for i in range(N):
    XY=[]
    XY=list(map(int, input().split()))
    list_i.append(XY)
# print(list_i)

#三角形ができないときの条件は、角度がつかないこと。

#重複なしの3点を列挙
import itertools
total=0
all = itertools.combinations(list_i, 3)
for i in all:
    i=list(i) #setから、listに変換
    # print(i)
    #直線上に3点が並ぶかを判定
    X1=i[0][0]
    Y1=i[0][1]
    X2=i[1][0]
    Y2=i[1][1]
    X3=i[2][0]
    Y3=i[2][1]
    # print(X1, Y1, X2, Y2, X3, Y3)
    if X1==X2==X3:#Y軸に平行な時、傾き無限大で直線上
        continue #以下の処理を飛ばす
    else:
        if X1==X2:
            total+=1
            continue

        else:

            if Y3-Y1==(Y2-Y1)/(X2-X1)*(X3-X1):
                continue #何もしない
            else:
                total+=1 #三角形が作れるので、数える。
print(total)

まず、itertoolsのcombinationsで、3点の組み合わせを求める。

三角形ができるときの条件は、3点が直線上にないことなので、点1, 点2を持ってきて、直線の式を作り、点3が直線上にあればカウントしないようにした。Y軸に平行なときは、傾きが∞になるので、if文でのぞいた。サンプルテストはどっちもOKだったので、投下。

pypy3で提出すると、AC16個、WA7個。(pythonは余裕のTLE)
どうやら、以下の部分に不備があるとアタリをつけるが、この時点で残り5分。いろいろ提出したが、時間切れ。悔しすぎる。。。

不備部分
if X1==X2==X3:#Y軸に平行な時、傾き無限大で直線上
        continue #以下の処理を飛ばす
    else:
        if X1==X2:

やってみると、上記の部分で、
Y3-Y1==(Y2-Y1)/(X2-X1)*(X3-X1)
の式が、同じになる条件の漏れがあった。
直線の式を変形して、if文で判定でよかった。

正解のif文
if (X2-X1)*(Y3-Y1)==(X3-X1)*(Y2-Y1):
    continue #以下の処理を飛ばす
else:
    total+=1 #三角形が作れるので、数える。
ABC224C_AC
N=int(input())

list_i=[]
for i in range(N):
    XY=[]
    XY=list(map(int, input().split()))
    list_i.append(XY)
# print(list_i)

#三角形ができないときの条件は、角度がつかないこと。

#重複なしの3点を列挙
import itertools
total=0
all = itertools.combinations(list_i, 3)
for i in all:
    i=list(i) #setから、listに変換
    # print(i)
    #直線上に3点が並ぶかを判定
    X1=i[0][0]
    Y1=i[0][1]
    X2=i[1][0]
    Y2=i[1][1]
    X3=i[2][0]
    Y3=i[2][1]
    # print(X1, Y1, X2, Y2, X3, Y3)

    #正解
    if (X2-X1)*(Y3-Y1)==(X3-X1)*(Y2-Y1):
        continue #以下の処理を飛ばす
    else:
        total+=1 #三角形が作れるので、数える。

print(total)

上記のコードでコンテスト後だが、無事AC。

公式解説の解答例を見てみると、3点の座標から、面積を導き出して、0になるならないを判定していて非常にスマートだった。

悔しい敗戦となりました。この悔しさがあるからこそ、ACした時の喜びは一入なのです。。。
次また頑張ります。お疲れさまでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0