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

回答編集履歴

1

バグの修正

2020/04/19 03:30

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -48,4 +48,34 @@
48
48
  時刻 15~18 は 2人
49
49
  時刻 18~23 は 3人
50
50
  時刻 23~25 は 2人
51
- 時刻 25~27 は 1人
51
+ 時刻 25~27 は 1人
52
+
53
+ **追記**
54
+ バグがあったので、qsort に与える比較関数 comp を次のように訂正します。
55
+ ```C
56
+ int comp(const void *x, const void *y)
57
+ {
58
+ int d = ((struct Data *)x)->time - ((struct Data *)y)->time;
59
+ return d ? d : ((struct Data *)x)->se - ((struct Data *)y)->se;
60
+ }
61
+ ```
62
+ どういうバグかというと、
63
+ 2
64
+ 10 20
65
+ 20 30
66
+ このような入力があった場合、時刻20 において人が入れ替わるわけですが、
67
+ これを 2人が同時に走っていると解釈してしまうことがあるのです。
68
+ コードを見ればわかるように、この入力を data[] に
69
+ 10 1
70
+ 20 -1
71
+ 20 1
72
+ 30 -1
73
+ と取り込んだ後、ソートするのですが、qsort は安定ソートではないので
74
+ 2つの同じ値 20 について、どちらが先になるかが決定していません。
75
+ 10 1
76
+ 20 1
77
+ 20 -1
78
+ 30 -1
79
+ となることがあるのです。安定ソートに変更しても、入力データが
80
+ ソートされているとは限りません。
81
+ そこで、今回の comp の変更になりました。