【题解】 2月19日 厦门双十中学NOIP2014模拟D2 T2 采药人接水果
【问题描述】
采药人虽然 AFO(SU),但他在闲暇的时候还是可以玩一玩接水果(cat)的。但他渐渐发现 cat 好像有点太弱智。于是他不想浪费他的智商,于是决定写一个程序帮他玩。
cat 是这样玩的,开始时没有水果,采药人可以自己选择他所在的位置。接下来每隔 \(1\) 秒会有一个水果落到地上,而且第 \(i\) 秒落下的水果落到 \(x_i\) 这个位置,得分为 \(1\)。而采药人每秒只能移动一单位长度,但他不需要担心到了水果落下的位置还接不到水果,而且接水果不需要时间。采药人当然希望自己的分数越高越好。
采药人觉得写这个程序也太简单了,并且得分过低,于是他写了个挂,将接水果的一个人变成了两个人。但他却突然不想写 auto 程序了?这时转头看见了正在拼命切题的你,于是毫不犹豫地把这个问题交给了你。
【输入格式】
第 \(1\) 行:一个正整数 \(n\),游戏时间有 \(n\) 秒
接下来 \(n\) 行:第 \(i+1\) 行,一个正整数 \(x_i\)
【输出格式】
共 \(1\) 行:最大得分
【数据范围】
对于 \(30\%\) 的数据,\(n\leqslant100\)
对于 \(60\%\) 的数据,\(n\leqslant1000\)
对于 \(80\%\) 的数据,\(n\leqslant10000\)
对于 \(100\%\) 的数据,\(n\leqslant500000\), \(x_i\leqslant50000\)
Solution
考虑用二元组 \((x,y)\) 来表示一个水果,其含义为 (出现时间, 出现位置)。
假设我们已经拿了第 \(a\) 个水果,接下来要去拿第 \(b\) 个水果,则需要满足的条件为:
可以发现是个二维偏序的关系。
由于有两个人接,排序后求最长 \(2\) 不相交子序列即可。
做法:
有人会想要贪心,他的证明如下:
先求一次最长不下降子序列,再将最长不下降子序列中的数剔除后再做一次最长不下降子序列,答案是这两个序列的长度和。
我们考虑最长不下降子序列中,它取得的最优解,将自己其中一个数给对面以后,长度减一。
对面拿到这个数以后,长度最多变长一,也有可能不变。
所以贪心是正确的。
???????
考虑下面这一组数据:
6 2 8 9 5 1 9 10 6 6
我们贪心得到第一个数组的数字为:
1 5 6 6 10
我们实际使用了2 8 9 9 10
然后剩下:
6 5 9 6 6
但是,如果我们考虑第一个取用6而不是2的话,剩下便是:
2 5 9 6 6,是更优秀的解。
贪心没有错,但是对于第x位的贪心应是在x+1位不变的情况下x最大,使得d2数组更优秀
代码:
正确性:
我们考虑当d1中的一个数被抹除的时候,直接插入到第二个数组。
那么,被抹除的数因为不是按照时间抹除的,所以插入可能导致第一维错乱?
我们考虑的一个样例:
7 30 3 2 29
虽然3先被挤出去,30后被挤出去,但是d1中既然有3放在了30前面,那么肯定有一个数(7)比30小,而它被3挤掉了,而它和30可以构成长度为2的序列。
也就是说,虽然d2数组最后的情况是2 30,但是仍然是合法的。
即是:
a,b 先后被c,d挤掉,且a比b后插入,当且仅当a挤掉了一个数字(否则b被挤掉)
设被挤掉的数是x,那么x肯定<=b,且x比b先插入。(或者你的x又挤掉了一个数)
那么b被丢到d2数组里时,肯定有一个x被a替换掉且x<=b在b的前面,不会因为a替换了一个数导致那个数比b小,然后使得序列变长了。
最优性:
我们往d2数组里插入数字,实际上还包括了第一个最长子序列里的数字,也就是说,比实际上d2数组能选择的还多。
那么肯定是最优性的。
至于会不会因为多余的数字导致问题,上面的正确性已经证明了。