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

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

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

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

Q&A

解決済

1回答

3912閲覧

競技プログラミング TLEについて

labpynguin

総合スコア11

Python 3.x

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

0グッド

1クリップ

投稿2020/05/15 09:38

前提・実現したいこと

AtCoder 041 C
https://atcoder.jp/contests/abc041/tasks/abc041_c

問題を解き、提出するとTLEとなってしまいました。
自分のコードのどこが遅いのか分からず修正に手間取っています。

分かる方、ご教授願いたいです。

発生している問題・エラーメッセージ

TLE

該当のソースコード

python

1n = int(input()) 2a = list(map(int,input().split())) 3A = list(reversed(sorted(a))) 4 5for i in range(n): 6 print(a.index(A[i])+1)

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題によると、生徒数Nは最大で10の5乗分です。高い方順に並べ替えた上でindexメソッドで探索した場合、最大でO(N^2)の計算量になるからではないでしょうか。つまり、10の10乗。Pythonですと(また、恐らくC++でも)この計算量だとTLEでしょう。

teratailでも過去、TLEに関して質問回答が挙がっていますので、参考になると思います。

競技プログラミングの解答がTLEになってしまう - teratail#121345
競プロの回答がTLEとなる - teratail#205829
AtcoderでTLEとなる原因について【ABC問題】 - teratail#212668


** 追記しました:2020-05-16 01:40 **

私自身の回答が気になったので検証してみました。質問者さんのオリジナルのコードをもとに、indexメソッドを使わない方法で試してみます。

まず、AtCoderの各コンテストのテストケースが収められているAtCoder のテストケースをあたってみると、残念ながらABC041のテストケースは無いようでした。その為、テストケースを作成するコードを作りました。簡単にするために、身長は出席番号の取り得る値と同じ(10の5乗)としています。

Python3

1import random 2 3n = pow(10, 5) 4l = [str(v) for v in range(1, n + 1)] 5 6print(n) 7random.shuffle(l) 8print(' '.join(l))

このプログラムを実行すると、以下のように生徒100000人分の身長ダミーデータを出力します。

PlainText

1100000 280228 51819 9780 60213 55267 31769 29648 4721...(100000件のデータ)

このデータ(ファイル in1.txt)をもとに、まず質問者さんオリジナルのコードで実行し、実行時間をtimeコマンドで計測してみます。尚、実行環境としてはWindows10/WSL(Ubuntu) 、CPUはIntel Core i7-4870HQ 2.5GHz です。

sh

1$ time python3 x1.py < in1.txt > out1.txt 2 3real 0m59.463s 4user 0m59.422s 5sys 0m0.031s

およそ59.5秒かかります。AtCoderでは完全にTLEです。

このコードをもとにindexメソッドを使用せず、身長をキーとして、出席番号(-1)を値とした辞書(hash)で検索するよう実装してみます。

Python3

1n = int(input()) 2a = list(map(int,input().split())) 3A = list(reversed(sorted(a))) 4 5kv = {} 6for i in range(n): 7 kv[a[i]] = i 8 9for i in range(n): 10 print(kv[A[i]] + 1)

これを同じデータでテストします。

sh

1$ time python3 x1b.py < in1.txt > out1b.txt 2real 0m0.208s 3user 0m0.141s 4sys 0m0.031s

実行時間が0.2秒強、となりました。AtCoderのサイトで実際に提出した訳ではありませんが、これであればACできそうです。それぞれ、出力結果も同じです。

sh

1$ ls -l out1.txt out1b.txt 2-rwxrwxrwx 1 user01 user01 588895 May 16 01:17 out1.txt 3-rwxrwxrwx 1 user01 user01 588895 May 16 01:23 out1b.txt 4$ diff out1.txt out1b.txt 5$

参考になれば幸いです。

投稿2020/05/15 10:21

編集2020/05/15 16:41
dodox86

総合スコア9183

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

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

labpynguin

2020/05/17 08:23

詳しくありがとうございます。 ようやく理解できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問