問題によると、生徒数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/17 08:23