質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1040閲覧

Atcoder Biginner Contest 224 C問題が不正解及びTLEとなる

tana1021

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/23 14:17

Atcoder Biginner Contest 224 C問題についての質問です。問題は以下です。
https://atcoder.jp/contests/abc224/tasks/abc224_c
私の回答方針は3点の全ての組み合わせを求め、それぞれの辺の長さを求めます。そして三角形の成立条件であるA+B>CかつA+C>BかつB+C>Aとなればcountを+1するというものです。下のコードを提出すると不正解及びTLE(実行時間超過)となってしまいます。
解説(https://atcoder.jp/contests/abc224/editorial/2810)を見ると全ての組み合わせを実行することは問題ないそうです(この辺はまだわかっていません)。おそらくTLEとなってしまうことはnormの計算やif文での演算部によって超過してしまうのではないかと考えています。
また、方針自体は異なっていても成立条件は誤っていないはずなのでTLEとなることはあったとしても不正解となることの原因がわかりません。私自身の見解ですが、有効数字によって辺の少しの差の条件が通っていないのではないかと考えています。
以上の2つの点(なぜTLE、WAとなるのか)に関して、何か考えられる原因がありましたら教えていただきたいです。
・提出コード

Python3

1import itertools 2import numpy as np 3 4N = int(input()) 5coor = [] 6for _ in range(N): 7 coor.append(list(map(int,input().split()))) 8 9count = 0 10for v in itertools.combinations(range(N),3): 11 a = np.array(coor[v[0]]) 12 b = np.array(coor[v[1]]) 13 c = np.array(coor[v[2]]) 14 #print(a,b,c) 15 ab = np.linalg.norm(a-b) 16 ac = np.linalg.norm(a-c) 17 bc = np.linalg.norm(b-c) 18 #print(ab,bc,ac) 19 if ab+ac>bc and ab+bc>ac and ac+bc>ab: 20 count += 1 21print(count)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

有効数字の問題だと思うのなら、極端な数字で試せばわかるでしょう。(正しい出力は1)

text

13 21000000000 1000000000 3-1000000000 -1000000000 40 1

TLEのほうは、おそらく距離の計算でしょう。
平方根の計算には、それなりに時間がかかりそうです。


もう少し分かりやすい三角形をベースに、ざっくりとした説明を試みます。

座標(x,0)(-x,0)(0,1)からなる二等辺三角形を考えます(x>0)。
そうすると、底辺の長さが2x、斜辺の長さが√(x^2+1)となります。

ここで、xは10^9以下なので、x^2は最大20桁になりますが、floatの有効桁は16桁弱なので、表現しきれません。
そうなると、x^2に+1したとしても変化が少なすぎて表現しきれず、x^2のままとなります。
よって、xが大きい場合、この三角形の斜辺はxとなり、三角形の条件を満たさなくなります。

実際には、x=67108864にて斜辺の長さがxと等しくなります。
x^2はfloatの有効桁の限界まで到達していませんが、sqrt後の値とxとの差が限界を超えたのでしょう。
実際、直前の67108863での計算結果は、16桁の数値となっています。

python

1>>> import math 2>>> math.sqrt(67108863*67108863+1) 367108863.00000001 4>>> math.sqrt(67108864*67108864+1) 567108864.0

投稿2021/10/23 20:59

編集2021/10/24 11:42
actorbug

総合スコア2429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

plain

1以下の入力データの場合、出力は0になるはずですが、tana1021さんのコードでは1が出力されます。 2そのため、不正解となります。 3 43 51 0 62 0 73 0

上記は間違っていました。

原因は、整数と浮動小数点数の問題です。
np.linalg.normは浮動小数点数を返すので、actorbugさんが書かれているように誤差が出てしまいます。
途中で浮動小数点数を使うと誤差は回避できません。
言い換えれば、全てを整数演算で行えば正しく計算できるでしょう。

ヒントは「平行」です。

投稿2021/10/23 16:29

編集2021/10/25 00:52
ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tana1021

2021/10/23 18:26

その入力ですとab=1,ac=2,bc=1となるため出力は0となります。実際にプログラムを動かしても0となりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問