数组惊艳绝伦的操作:
链接:https://ac.nowcoder.com/acm/contest/12986/G
问题描述:给定两个数组,a[]和b[]。给定两种操作
A:删除数组首位元素,所有元素进行前移,末尾添加任意元素。记为一次操作
B:可以将任意元素进行修改。记为一次操作
求:最少经过几次操作可以把B变成A。
解题思路:毫无疑问,能用A操作完成的我们不用B操作,A操作无法获得>1的收益时我们再进行B操作。
cin >> s; a[s] = i; for (i = 1; i <= n; i++) { if (a[s] - b[s] >= 0) c[a[s] - b[s]]++; if (c[a[s] - b[s] > max]) max = c[a[s] - b[s]]; } cout << n - max; //c[]下标次A操作,其余全部B操作
这个数组c[]着实巧妙,下标所记录的是相同数字照应需要向前移动几位。
取可以照的最多位移动即可。 开始做这题时我真的被反复几次A操作困扰了好久。
用下标做为输入值,值作为记录下标(或者一些标志)。
在算法里感觉还是很常见的。尤其问题规模不大时,空间换时间..