A
题目大意
一个长度为 $n$ 的序列,选择一个长度为 $k$ 的子序列,使得字典序最小。
$O(n \log n)$ 会被卡,要求线性。
(这题其实挺正常挺经典的。。。)
解法
本质是贪心,假设目前是第 $i$ 轮,上一轮选了第 $x$ 个,那么现在就是在 $[x+1,n-k+i]$ 里取最小值。
求最小值的区间是滑窗向右的,可以用单调队列
A加强版
题目大意
这是一道交互题。
先给你一个整数 $k$ ($k \le 10^6$),然后按顺序给你未知个整数 $a_1,\cdots,a_n$($n \le 1.5 \times 10^7$,$n$ 不输入),要求你求出一个长度为 $k$ 的字典序最小的子序列。
内存 32M,即空间限制是 $O(k)$ 的。
解法1
其实跟上一题是差不多的。。。
由于不知道什么时候读完所有的数,所以要开多一个队列存最后读进来的 $k$ 个数,然后每来一个数,就把队头拿去维护单调队列。
解法2
直接考虑每 $k$ 个数做一次。
假设我们目前的答案子序列为 A,然后又读了 $k$ 个数存在 B 里,那我可以用两个指针扫这两个数组来合并。
时间是 $O(n/k \cdot k) = O(n)$。
B
题目大意
读入一个字符串(长度 <= 20),请你读懂字符串的含义并用程序输出对应的数字。
比如字符串是“This year”,你应该输出“2016”。
该题有 20 组数据,每组数据的字符串都是相同的。
该题可以多次提交,每次提交都能返回评测结果(AC、WA 等)。
猎奇题
解法1
枚举答案显然是不行的。。。
让机器变成 AI 读懂字符串好像也不行。。。
只有我们自己想办法知道字符串是什么了。
试通过评测结果来推断字符串是什么。
比如我们猜字符串第一位是 a,那么如果 s[1] 果然是 ‘a’,就让它返回 RE,否则让他返回 TLE。我们知道肯定有办法设计算法使它强行 RE 或 TLE 或其他什么的。
然后每一次提交可以判断 20 次,所以可以在有限步数内得到字符串。
解法2
用提交状态判断还是慢了点。
我们可以考虑用时间来判断。比如,如果它第一位为 a,就让它循环 100 次,b 就 1000 次……这样一次提交就知道整个字符串了。
时间误差比较大,所以可以再改,用空间来判!
C
题目大意
这是一道提答题,有 10 组数据。
一组数据中,若读入是 x,正确答案是 ans,则 |ans-x|<=5。
一个测试点你输出 y,可以获得的分值是 max( 0, 11-e^|y-ans| ),分值会下取整。
现在让你 AC 这个题。
解法
得 10 分:y=ans
得 8 分:|y-ans|=1
得 3 分:|y-ans|=2
其余得 0 分。
于是我们先猜 x,若不为 0 则再猜一次就出解;若为 0 就猜 x+5,再不行就 x-5,则一定出解了。
最坏情况下,第 4 次提交即可 AC。