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

回答編集履歴

2

コード微修正

2018/10/26 00:33

投稿

set0gut1
set0gut1

スコア2413

answer CHANGED
@@ -49,9 +49,6 @@
49
49
 
50
50
  # 引数 todo: 訂正すべき数
51
51
  def solve(begin, end, todo):
52
- if todo == 0 or begin == end:
53
- return
54
-
55
52
  middle = (begin + end) / 2
56
53
  tmp_array = [0] * LENGTH
57
54
  for i in range(begin, middle):

1

改善案追記

2018/10/26 00:33

投稿

set0gut1
set0gut1

スコア2413

answer CHANGED
@@ -10,4 +10,75 @@
10
10
  `010000` -> 3
11
11
  `100000` -> 3
12
12
 
13
- てな感じにやりまして、全部0のときより増えてればそこは`1`、減ってりゃ`0`でありんす。
13
+ てな感じにやりまして、全部0のときより増えてればそこは`1`、減ってりゃ`0`でありんす。
14
+
15
+ ---------
16
+
17
+ ■追記: 改善方法、長考した結果
18
+
19
+ あんま綺麗なコードじゃなくて恐縮なんですが、二分探査的に置き換えていって、連続した`0`または`1`を検出したらそこで足切りする方法試してみました。
20
+
21
+ 長さ 1000 で 10 回計測したところ、クエリ回数が平均 717.5 となりました。
22
+
23
+ ```
24
+ # coding: utf-8
25
+ import random
26
+
27
+ def make_string(int_array):
28
+ return "".join(map(str, int_array))
29
+
30
+ LENGTH = 1000
31
+ REAL_ANSWER = make_string([random.randint(0, 1) for i in range(LENGTH)])
32
+
33
+ print "REAL_ANSWER:\t" + REAL_ANSWER
34
+
35
+ count = 0
36
+
37
+ def check(query):
38
+ global count
39
+ count += 1
40
+ print "query (" + str(count) + "):\t" + query
41
+ ret = 0
42
+ for i in range(0, len(query)):
43
+ if query[i] == REAL_ANSWER[i]:
44
+ ret += 1
45
+ return ret
46
+
47
+ NUM_OF_ZERO = check(make_string([0] * LENGTH))
48
+ my_answer = [0] * LENGTH
49
+
50
+ # 引数 todo: 訂正すべき数
51
+ def solve(begin, end, todo):
52
+ if todo == 0 or begin == end:
53
+ return
54
+
55
+ middle = (begin + end) / 2
56
+ tmp_array = [0] * LENGTH
57
+ for i in range(begin, middle):
58
+ tmp_array[i] = 1
59
+ tmp_score = check(make_string(tmp_array))
60
+
61
+ left_todo = (tmp_score - NUM_OF_ZERO + middle - begin) / 2
62
+ right_todo = todo - left_todo
63
+
64
+ if (left_todo == 0):
65
+ pass
66
+ elif (left_todo == middle - begin):
67
+ for i in range(begin, middle):
68
+ my_answer[i] = 1
69
+ else:
70
+ solve(begin, middle, left_todo)
71
+
72
+ if (right_todo == 0):
73
+ pass
74
+ elif (right_todo == end - middle):
75
+ for i in range(middle, end):
76
+ my_answer[i] = 1
77
+ else:
78
+ solve(middle, end, right_todo)
79
+
80
+
81
+ solve(0, LENGTH, LENGTH - NUM_OF_ZERO)
82
+ print "my_answer:\t" + make_string(my_answer)
83
+ print make_string(my_answer) == REAL_ANSWER
84
+ ```