Kane 说: 为什么不是40?每个题试四个答案保持其他题目回答不变,只有一个答案总分比其他三个高一分
夏日勘探者 说: 算上了得到正确答案后提交的那次,虽然仔细一想发现不需要。
Kane 说: 39,进入最后一题的时候有一个答案已经试过了 按这思路好像还能再减。。。?第一题最坏情况试4次的话,最有一个选项不用试可以进入第二题的环节了 包括这个~40的最坏情况只会发生在第一次全选错的情况,但看...
Kane 说: I see是这样。第一次的得分是X,之后按照这个流程,如果有一题初始答案正确,那么只需要一次尝试(发现分掉了)就可以move on;如果初始答案不正确,需要尝试两次其他答案,如果分都没有涨那剩下没选得...
Blackadder 说: 只用试全A全B全C可知全D,且试出第9题答案时,已可知第10题答案。因此是3+1+18-3=19
Blackadder 说: 只用试全A全B全C可知全D,且试出第9题答案时,已可知第10题答案。因此是3+18-3+1=19
Kane 说: 那还剩两题的时候ABCD里至少两个已经满了可以排除,所以第9题也只要试一次。。
Blackadder 说: 全A+全B为4,假设全C为3,将C一个个改为D,最多9次可找出C、D的6个全部位置,剩下4个AB则需要试3次,因此为3+9+3+1=16
Blackadder 说: 2次试出全A+全B为X X>=5,最多9次可找出A、B的X个全部位置,剩下(10-X)个CD位则需要试(9-X)次,因此为2+9+(9-X)+1=21-X<=16 X<5,10次找出C、D的全部位置...
Kane 说: 把你这思路推广到一般n题m选项(假设n >> m),就是先试全X,然后从高到低排序组对?这样主部大概是个nm/4的样子。不知道这个1/4的constant是不是最优的
Blackadder 说: 2次试出全A+全B为X X>=5,最多9次可找出A、B的X个全部位置,剩下(10-X)个CD位则需要试(9-X)次,因此为2+9+(9-X)+1=21-X<=16
烈之斩 说: 为啥是9-X次呢? 假设X=8,剩下2个CD位,最差情况要试2次才能知道吧? (A/B已经找出) 试C,C: 9分 试D,C: 8分 试C,D:过关 比如这题 [3, 4, 1, 2, 1, ...
Blackadder 说: 又看了一眼,想到一个16及以下的通解: 先countABC,可得countD,按大小排序为abcd,其中必有a+b=X<5 (按#3-11第二种情况) 9次找出c、d的全部位置,a,b试(X-1)次...
庄生晓梦 说: 两道题的极端情况的答案是bd,使用我的算法提交过程是aa、ab、ba、bb、bc、bd,即6次。如果两道题使用遍历的话,极端是8次。所以至少比遍历算法要强点。
Kane 说: 我上面有个一般的方法,在2题的情况下也是6次 上来随便猜一个答案,之后就每道题试就行了,每题最多试两个不一样的答案就可以确定正确答案,加上最初的一次和最后一次提交,2 + 2n (n是题数)
Kane 说: 密码你得试4^10
伊々若羽 说: Kane 说: 密码你得试4^10每个题4个选项试4次,其余题空白,得到全部正确选项也就最多40次。
烈之斩 说: 我最后直接枚举了,稍微答过几次之后剩余的选项其实就很少了
Acylation 说: 两个优化思路,一个是以最高分的为基础,找和他相近的比对 还有一种,因为期望得分是2.5,可以想见低分答案比高分答案多很多,可以从低分答案入手,比对排除 比如把所有答0分的倒霉蛋用起来
按这思路好像还能再减。。。?第一题最坏情况试4次的话,最有一个选项不用试可以进入第二题的环节了
包括这个~40的最坏情况只会发生在第一次全选错的情况,但看到0分可以每题直接排除掉一个错误答案
这样一共是1 + 2(10-X) + X=21-X,如果算上最后提交的一次那是22-X
题多的话可以优化一下起始的X。上来先答全A全B全C全D,至少一次3分。那么就是4 + 20 - 3 + 1 = 22,和上面最坏情况一样,但题数>>选项的时候应该有用
X>=5,最多9次可找出A、B的X个全部位置,剩下(10-X)个CD位则需要试(9-X)次,因此为2+9+(9-X)+1=21-X<=16
X<5,10次找出C、D的全部位置,AB试(X-1)次,2+10+(X-1)+1=X+12<=16
假设X=8,剩下2个CD位,最差情况要试2次才能知道吧?
(A/B已经找出)
试C,C: 9分
试D,C: 8分
试C,D:过关
比如这题 [3, 4, 1, 2, 1, 2, 1, 2, 1, 2], X=8, 按照你的计算需要21-8=13次,但是实际需要14次:
Attempt #01: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] Score: 04 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #02: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] Score: 04 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
A+B count: 8
Attempt #03: [2, 1, 1, 1, 1, 1, 1, 1, 1, 1] Score: 04 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #04: [1, 2, 1, 1, 1, 1, 1, 1, 1, 1] Score: 04 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #05: [1, 1, 2, 1, 1, 1, 1, 1, 1, 1] Score: 03 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #06: [1, 1, 1, 2, 1, 1, 1, 1, 1, 1] Score: 05 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #07: [1, 1, 1, 2, 2, 1, 1, 1, 1, 1] Score: 04 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #08: [1, 1, 1, 2, 1, 2, 1, 1, 1, 1] Score: 06 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #09: [1, 1, 1, 2, 1, 2, 2, 1, 1, 1] Score: 05 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #10: [1, 1, 1, 2, 1, 2, 1, 2, 1, 1] Score: 07 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #11: [1, 1, 1, 2, 1, 2, 1, 2, 2, 1] Score: 06 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Tried 9 times to find all A/B answers.
Attempt #12: [3, 3, 1, 2, 1, 2, 1, 2, 1, 2] Score: 09 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #13: [4, 3, 1, 2, 1, 2, 1, 2, 1, 2] Score: 08 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
Attempt #14: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2] Score: 10 (Solutions: [3, 4, 1, 2, 1, 2, 1, 2, 1, 2])
再比如这道题:
[3, 4, 2, 3, 4, 2, 1, 1, 2, 4]
全A = 2, 全B = 3
同样按照这策略,需要17次(我写的算法是测试时会把已知的正确答案带上,便于撞大运;不影响最坏情况结果。)
Attempt #01: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] Score: 02 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #02: [2, 2, 2, 2, 2, 2, 2, 2, 2, 2] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #03: [2, 1, 1, 1, 1, 1, 1, 1, 1, 1] Score: 02 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #04: [1, 2, 1, 1, 1, 1, 1, 1, 1, 1] Score: 02 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #05: [1, 1, 2, 1, 1, 1, 1, 1, 1, 1] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #06: [1, 1, 2, 2, 1, 1, 1, 1, 1, 1] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #07: [1, 1, 2, 1, 2, 1, 1, 1, 1, 1] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #08: [1, 1, 2, 1, 1, 2, 1, 1, 1, 1] Score: 04 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #09: [1, 1, 2, 1, 1, 2, 2, 1, 1, 1] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #10: [1, 1, 2, 1, 1, 2, 1, 2, 1, 1] Score: 03 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #11: [1, 1, 2, 1, 1, 2, 1, 1, 2, 1] Score: 05 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #12: [3, 3, 2, 3, 3, 2, 1, 1, 2, 3] Score: 07 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #13: [4, 3, 2, 3, 3, 2, 1, 1, 2, 3] Score: 06 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #14: [3, 4, 2, 3, 3, 2, 1, 1, 2, 3] Score: 08 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #15: [3, 4, 2, 4, 3, 2, 1, 1, 2, 3] Score: 07 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #16: [3, 4, 2, 3, 4, 2, 1, 1, 2, 3] Score: 09 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
Attempt #17: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4] Score: 10 (Solutions: [3, 4, 2, 3, 4, 2, 1, 1, 2, 4])
用上面的策略跑了全部的组合:
Ran 1048576 times, average attempt count: 14.55; max: 17
但是好像A+B<5的情况,真的max=16
source code https://gist.github.com/fireatta ... 535b49a6556b417c68f
另外如果出现例如count(A) =6, count(B)=0的极端情况,不知道有没有更优的处理方式?
count(B)=0,可以直接count(C)来与A比对
先countABC,可得countD,按大小排序为abcd,其中必有a+b=X<5
(按#3-11第二种情况)
9次找出c、d的全部位置,a,b试(X-1)次
3+9+(X-1)+1=X+12<=16
Ran 1048576 times, average attempt count: 13.9450; max: 16
代码更新到那个gist了
上来随便猜一个答案,之后就每道题试就行了,每题最多试两个不一样的答案就可以确定正确答案,加上最初的一次和最后一次提交,2 + 2n (n是题数)
如果已经确定的题目中有某个选项的数量等于其出现频率则可以在接下来的尝试中直接排除这个选项,那接下来的题目只比较一次就够了
Ran 1048576 times, average attempt count: 13.9450; max: 16
还有一种,因为期望得分是2.5,可以想见低分答案比高分答案多很多,可以从低分答案入手,比对排除
比如把所有答0分的倒霉蛋用起来
正交对 + 幸运儿 应该可以快速做出来,先用正交对摸出来4列的答案的个数分布,再用高分答案去匹配