关于近期的“题目海龟汤”的一些结论

· · 个人记录

知周所众,题目海龟汤是很流行的一个事。

那今天,我们来破解!

  1. 要素

其实,如果我做海龟汤的话,要素是:

没啦。

  1. 理论步骤

最容易的是题目颜色。

我们可以二分。

八种颜色,可以三次出来。

BUT 如果 面试 那个题库几乎全是红题;CF 很多恶评。

怎么办?

我们会慢慢讨论。

  1. 假设是主题库

假设是主题库,那么直接三次二分出来颜色。

接下来,可以判断题目编号。

一般的这种可以问 5 次。

那么,开始!

第一次:问题目编号是不是仅有一个奇数
第二次:

若第一次为 是:问题目编号是不是仅有一个 0
若第一次为 否:问题目编号是不是仅有一个偶数

第三次:问题目编号的开头是不是偶数
第四次:问题目编号的末尾是不是偶数
第五次:问题目编号是否小于 4000

好,这样,我们就问了五次。

我们拿比较简单的这个来举例。

首先,按照要求,是主题库。

然后,三次二分出来是黄题。

接下来问出来的是:是是是否否。

看,这回运气比较好。

问了八次。

那么我们试试搜索一下。

P4089,P6023,P6045,P6067,P6069,P6205,P6207,P6403,P8081

诶!就这几个啦!

为了防止他说错,我们还可以问一下答案是否在其中。

是的话就可以!不是的话检查一遍再问。

到这里,最坏情况也只有十次。

我们发现有四道 USACO,两道 COCI。

Q11:是否为 USACO 或 COCI 中的一个?

A11:不是!

好,最后只剩三道题,我们可以一个一个问,三次问出答案。

最后次数为 14 次。

难度:3/10

  1. 假设为 入门与面试

欸。。。几乎全是红题呀。

没关系!我们可以先问一次,如果不是红题就简单了。

算了,我直接写了。

答案一定为 B3600,B3601,B3602,B3603,B3604,B3605,B3606,B3607,
B3608,B3609,B3610,B3611,B3612,B3613,B3614,B3615,
B3616,B3617,B3618,B3622,B3624,B3625,B3626,B3627,
B3628,B3629,B3630,B3631 中的一个。

问五个问题:

前两个问题二分十位,后三个问题把个位的数量降低到 <=2。

如果 =1,那么直接说。

如果 =2,那么都试一遍。

最坏情况:1+5+2=8 次。

问五个问题:

第一个问题求出百位。
第二个问题判断题目名称是否全为汉字。
第三到四个问题十位(有大概范围)。
第五个问题问题目名称长度是否>=4。

最后暴力。

最坏情况:5+(1~5)=6~10 次。

  1. 假设为 CodeForces

这个比较神奇。

如果我出的话,会出得很毒瘤:没有被搬。

所以第一次先问有没有被搬。

问:这场比赛存在一道题被搬了吗?

接下来二分

四次能二分出首位,最后一次问最后一位奇偶性。

然后在那里慢慢找。

如果 这场比赛存在一道题被搬了吗 的答案是 是:中间有空档,或者找到最后一道题,延后一个字母,看看行不行。

如果 这场比赛存在一道题被搬了吗 的答案是 否:看哪一场比赛没有被搬,核验后直接跳到二分最后一个字母就可以了。

接下来就可以找出来所有刚才是“行”的比赛,问一次。

不对的话核验一遍,再问一次。

接下来看情况:

可以二分颜色。

接下来二分题目的具体题号的最后一个字母。

其实这个可以问第几题,就不算五次。

二分结束,最后就要求最终答案了。

我们二分题目的大写字母个数,不行就二分 a 个数。

结束!

最坏情况:1+1+5+2+3+1+1=14 次

一次大概求出题目的数字长度(问长度是否是 4)。

接下来把范围控制在 1000 以内,然后二分三次,缩小到 125。

最后一次问偶数个数是否为长度-2。

如果不是,这个能筛掉 1/4 的,然后二分三次二分出末尾字母。

如果是,运气太好啦!

接下来在洛谷题库里二分颜色。

如果这样,你的范围是 20~100 道题。

div 几问一次是否为 div1,问一次是否为 div2。

接下来数据量就是 10~50 道题左右了。

现在,问出大写字母个数(两次)。

现在是 1+1+3+1+3+1+1+2=13 次。

估计现在数据量也就 10 道以内了。

四次二分题目名称长度,求出答案。

最坏情况:13+4=17 次。

  1. 假设为 SPOJ

最毒瘤的题库。

因为一万多道题!

怎么做?我们可以第一次像 CF 求出长度,后四次求出后四位的奇偶性。

最大的搜索范围为 625。

问一下是否被搬。

这个的话就可以缩小到 100~200 啦(因为很小,除非特意设定)

那么继续二分 - 前面的字符个数(三次)

继续二分 - 前面的数字个数(三次)

接下来,范围缩小到八九个,直接根据题目名称长度二分(三次)

最坏情况:1+3+3+4=10 次。

首先二分 - 后面的空格个数(两次)

然后二分 - 前面的字符个数(三次)

接下来,我们判断一下 - 后面的字母有没有 a,e,i,o,u(五次)

接下来,范围缩小到八九个,直接根据题目名称长度二分(三次)

最坏情况:1+2+3+5+3=14 次。