AtCoder ABC224 挑戦！(Python)

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

```ruby:ABC224A
S=input()

#erかistかを判定
if S[-2:]=='er':
    print('er')
else:
    print('ist')
```
必ずどっちかに判定されるので、istの方は節約した。

```ruby: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分くらい。

```ruby: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分。いろいろ提出したが、時間切れ。悔しすぎる。。。

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

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

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

```ruby: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した時の喜びは一入なのです。。。
次また頑張ります。お疲れさまでした。