关于序列变化问题的总结
类似于把原序列改成目标序列的问题 感觉这种思维题目 有必要总结一下qwq 而且总结一下思考问题的方式是有必要的 发现这些问题是有一定的通解的
下面的问题 感兴趣的可以找到出处 这里我只讨论思考问题的方式
首先 是一道思考题
我们知道 目标序列就是 a,a+1,a+2,a+3,.....a+n/2,a+n/2-1,n+n/2-2....a ,题目所求为修改多少个数字 可以使得原序列满足这样的条件;
那么 先考虑一个问题 如果题目给定的序列 就是符合题意的序列 我们显然 将原序列 和 目标序列 做差之后发现 我们将会得到一个 新序列 而这个新序列 形式必然是 :m,m,...,m;
每个数字必定相同 那如果原序列只有一个数字不符合题意 那我们得到的 做差序列 也必定只有一个数字和其他数字不一样 那么只需要修改这个不同的数字的位置的数字即可;
换句话说 其余相同的数字个数是最多的 我们选择保留了下来这些位置 那么修改次数 显示是长度-这个最长的长度;
所以 我们 首先 对原序列和目标序列 做差 得到 做差数列 我们知道这个做差数列上 相同数字最多的位置无需修改 所以我们要找到这个最长的数列;
具体是为什么呢 你不妨先思考一下这个问题 我们开一个数组num 记录做差之后的值的出现的次数;
如果从原序列ai到目标序列bi 需要改变的数值t 那么对于在num数组中t的个数 就是我们没有必要改变的原序列的个数 那么对于每一个就是n-num[t] 我们只需要取min 那么就是找到最长的那个相同数字的长度;
为了避免出现负数的情况 我们考虑加上一个较大值;好好考虑一下我们思考问题的方式 试着运用这种思想 可能现在不是很熟练 我们再看一道例题;
序列变化: 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增。其中无论是修改前还是修改后,每个元素都必须是整数。求最小修改次数;
我们上一道题目并没有直接求出改变多少 而是求出了最多保留多少位置 我们试着运用这个思想
首先 我们不妨自己构造一组 严格单调的序列 1,2,3,4,5....n;
我们尝试将原序列和这个构造出来的序列做差 那么我们得到一个新序列 记作{bn} 如果原序列单调 那么这个b序列一定是单调不下降的 而我们发现这些 非严格递增的位置我们是不需要修改的
所以我们保留下来b序列最长的不下降部分 那么答案就是序列长度-b序列的最长不下降子序列的长度;
我们看一个扩展 说白了都是一样的 模拟赛考了 写了个stl就可以了 题目将修改后仍然保证是正整数 这是唯一的不同之处;
我们依旧按照上面的方法 得到做差序列 我们发现如果出现 a[i]-i<0 的情况 一定要修改的 我们考虑将这些数字剔除 那么我们考虑剩下的部分 最少修改多少 那么我们就转化成了上一道题目
其实 也就是求出来b首项为非负整数的最长不下降子序列 然后用序列长度减去 和上一个问题其实上是一样的;
所以今天总结一下就是 说 对于一个序列变化成什么序列的问题 我们考虑将原序列和目标序列放在一起进行对比 而且将最少修改多少转化成最多保留多少位置进行求解问题
并且尝试 做一下他们的差值 观察是否有什么不同 尝试多构造一些样例 注重观察 还要积累 比如我原来做过这个题目简化版 所以我考场上就没想 就构造出来了序列
这是这样的问题比较好切入的思路 我们尝试思考 如果原序列直接满足要求 如果原序列 只有一个不满足 我们考虑这样的变化为 让由原来留下来的位置变成留下来多少少了多少
我们就能分析出来这样的问题;
趁着这个 我分析一下昨天的模拟赛(爆零赛)?? 都出点类原题可太水了 T1 不开freopen T3 开到ll 导致MLE 本着三百的心情交了 0/100/0 下次要算对空间 提前十分钟检查 就这样8 5555
看见同学们都写 题解了 我也写一下8
T1 显然发现是偶数的时候 小偷偷不到钱 显然是奇数的时候 我们找到每一个奇数位置的钱-1的最大值 因为不能偷到0 显然这是正确的 因为你 偷奇数位置 左右都是偶数位置 那么 我们都可以将当前补齐
T2 就是我上面研究的情况 构造序列 忽略小于0的数字 求最长不下降子序列即可
T3 一个dp https://www.cnblogs.com/Tyouchie/p/10668379.html
然后 我写过这个题目的题解 考场上这个题目 多了一个最短路 预处理即可 n l打反 调了半个小时hh 最后数组开大了 MLE qwq;
总的来说 题目是比较简单的 我的神仙同学们 都AK了 qwq