数组那些事儿

数组惊艳绝伦的操作:

链接: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操作困扰了好久。

 

 

用下标做为输入值,值作为记录下标(或者一些标志)。

在算法里感觉还是很常见的。尤其问题规模不大时,空间换时间..

posted @ 2021-03-28 17:09  anyiya  阅读(34)  评论(0编辑  收藏  举报