teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

記述修正

2020/05/15 16:41

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  まず、AtCoderの各コンテストのテストケースが収められている[AtCoder のテストケース](https://atcoder.jp/posts/20)をあたってみると、残念ながらABC041のテストケースは無いようでした。その為、テストケースを作成するコードを作りました。簡単にするために、身長は出席番号の取り得る値と同じ(10の5乗)としています。
15
15
 
16
- ```Python
16
+ ```Python3
17
17
  import random
18
18
 
19
19
  n = pow(10, 5)

1

検証結果を追記

2020/05/15 16:41

投稿

dodox86
dodox86

スコア9416

answer CHANGED
@@ -4,4 +4,70 @@
4
4
 
5
5
  [競技プログラミングの解答がTLEになってしまう - teratail#121345](https://teratail.com/questions/121345)
6
6
  [競プロの回答がTLEとなる - teratail#205829](https://teratail.com/questions/205829)
7
- [AtcoderでTLEとなる原因について【ABC問題】 - teratail#212668](https://teratail.com/questions/212668)
7
+ [AtcoderでTLEとなる原因について【ABC問題】 - teratail#212668](https://teratail.com/questions/212668)
8
+
9
+ ---
10
+ ** 追記しました:2020-05-16 01:40 **
11
+
12
+ 私自身の回答が気になったので検証してみました。質問者さんのオリジナルのコードをもとに、`index`メソッドを使わない方法で試してみます。
13
+
14
+ まず、AtCoderの各コンテストのテストケースが収められている[AtCoder のテストケース](https://atcoder.jp/posts/20)をあたってみると、残念ながらABC041のテストケースは無いようでした。その為、テストケースを作成するコードを作りました。簡単にするために、身長は出席番号の取り得る値と同じ(10の5乗)としています。
15
+
16
+ ```Python
17
+ import random
18
+
19
+ n = pow(10, 5)
20
+ l = [str(v) for v in range(1, n + 1)]
21
+
22
+ print(n)
23
+ random.shuffle(l)
24
+ print(' '.join(l))
25
+ ```
26
+
27
+ このプログラムを実行すると、以下のように生徒100000人分の身長ダミーデータを出力します。
28
+ ```PlainText
29
+ 100000
30
+ 80228 51819 9780 60213 55267 31769 29648 4721...(100000件のデータ)
31
+ ```
32
+
33
+ このデータ(ファイル in1.txt)をもとに、まず質問者さんオリジナルのコードで実行し、実行時間を`time`コマンドで計測してみます。尚、実行環境としてはWindows10/WSL(Ubuntu) 、CPUはIntel Core i7-4870HQ 2.5GHz です。
34
+
35
+ ```sh
36
+ $ time python3 x1.py < in1.txt > out1.txt
37
+
38
+ real 0m59.463s
39
+ user 0m59.422s
40
+ sys 0m0.031s
41
+ ```
42
+ およそ59.5秒かかります。AtCoderでは完全にTLEです。
43
+
44
+ このコードをもとに`index`メソッドを使用せず、身長をキーとして、出席番号(-1)を値とした辞書(hash)で検索するよう実装してみます。
45
+ ```Python3
46
+ n = int(input())
47
+ a = list(map(int,input().split()))
48
+ A = list(reversed(sorted(a)))
49
+
50
+ kv = {}
51
+ for i in range(n):
52
+ kv[a[i]] = i
53
+
54
+ for i in range(n):
55
+ print(kv[A[i]] + 1)
56
+ ```
57
+
58
+ これを同じデータでテストします。
59
+ ```sh
60
+ $ time python3 x1b.py < in1.txt > out1b.txt
61
+ real 0m0.208s
62
+ user 0m0.141s
63
+ sys 0m0.031s
64
+ ```
65
+ 実行時間が0.2秒強、となりました。AtCoderのサイトで実際に提出した訳ではありませんが、これであればACできそうです。それぞれ、出力結果も同じです。
66
+ ```sh
67
+ $ ls -l out1.txt out1b.txt
68
+ -rwxrwxrwx 1 user01 user01 588895 May 16 01:17 out1.txt
69
+ -rwxrwxrwx 1 user01 user01 588895 May 16 01:23 out1b.txt
70
+ $ diff out1.txt out1b.txt
71
+ $
72
+ ```
73
+ 参考になれば幸いです。