关于近期的“题目海龟汤”的一些结论
知周所众,题目海龟汤是很流行的一个事。
那今天,我们来破解!
- 要素
其实,如果我做海龟汤的话,要素是:
- 题目编号
- 题目颜色
- 算法标签
- 题目标签
- 题目背景
- 题目类型
- 题目题库(比如 CF)
- 通过/提交数
- 题解数
- 年份
- 数据范围(很重要)
- 题目参数个数(比如有且仅有图论的题,那么是
n,m ,答案为2 ) - 是否为搬题,如果是,搬题人(比如 一只书虫仔,CCF_NOI )
- 源比赛名称
没啦。
- 理论步骤
最容易的是题目颜色。
我们可以二分。
八种颜色,可以三次出来。
BUT 如果 面试 那个题库几乎全是红题;CF 很多恶评。
怎么办?
我们会慢慢讨论。
- 假设是主题库
假设是主题库,那么直接三次二分出来颜色。
接下来,可以判断题目编号。
一般的这种可以问 5 次。
那么,开始!
第一次:问题目编号是不是仅有一个奇数
第二次:
若第一次为 是:问题目编号是不是仅有一个 0
若第一次为 否:问题目编号是不是仅有一个偶数
第三次:问题目编号的开头是不是偶数
第四次:问题目编号的末尾是不是偶数
第五次:问题目编号是否小于 4000
好,这样,我们就问了五次。
我们拿比较简单的这个来举例。
首先,按照要求,是主题库。
然后,三次二分出来是黄题。
接下来问出来的是:是是是否否。
看,这回运气比较好。
问了八次。
那么我们试试搜索一下。
P4089,P6023,P6045,P6067,P6069,P6205,P6207,P6403,P8081
诶!就这几个啦!
为了防止他说错,我们还可以问一下答案是否在其中。
是的话就可以!不是的话检查一遍再问。
到这里,最坏情况也只有十次。
我们发现有四道 USACO,两道 COCI。
Q11:是否为 USACO 或 COCI 中的一个?
A11:不是!
好,最后只剩三道题,我们可以一个一个问,三次问出答案。
最后次数为 14 次。
难度:3/10
- 假设为 入门与面试
欸。。。几乎全是红题呀。
没关系!我们可以先问一次,如果不是红题就简单了。
算了,我直接写了。
- 如果不是红题
答案一定为 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 次。
- 假设为 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 次。
- 假设为 SPOJ
最毒瘤的题库。
因为一万多道题!
怎么做?我们可以第一次像 CF 求出长度,后四次求出后四位的奇偶性。
最大的搜索范围为 625。
问一下是否被搬。
- 没被搬
这个的话就可以缩小到 100~200 啦(因为很小,除非特意设定)
那么继续二分 - 前面的字符个数(三次)
继续二分 - 前面的数字个数(三次)
接下来,范围缩小到八九个,直接根据题目名称长度二分(三次)
最坏情况:1+3+3+4=10 次。
- 被搬了
首先二分 - 后面的空格个数(两次)
然后二分 - 前面的字符个数(三次)
接下来,我们判断一下 - 后面的字母有没有 a,e,i,o,u(五次)
接下来,范围缩小到八九个,直接根据题目名称长度二分(三次)
最坏情况:1+2+3+5+3=14 次。