数列转换(守恒思想)

有一个数列  a1,a2,a3,a4,a5....... an 。每次可以从中挑选相邻的三个数  ai-1, ai ,ai+1,然后变为:  ai-1+ai, -ai, ai+1 +ai;即将中间的数加到两边去,自己置为相反数。

现在已知初始序列, 然后给定一个目标序列,求问是否可以通过以上操作将 初始序列转换为目标序列?

 

如: ( 1,6,9,4,2,0)-》(7,-6,19,2,-6,6)是可以的,但是(1,2,3)->(1,3,2)是不行的。

 

思路:这个题跟之前一篇日志中的小朋友分苹果问题是蛮像的,注意每次操作将 中间个数置反并加到两边去,三个数的和是不变的。

所以我们第一反应是两个数列的累加和必须是一样的,这是第一个条件,但从(1,2,3)-》(1,3,2)不行可以看出这个条件是不够的。

我们首先将数列转换为前加和的形式: Si = Si-1+ai; 即 (S1,S2,S3........Sn),然后我们考虑原数列上的操作在前加和数列上有什么变化:

先看单三个的情况:  S1=a1 ,  S2 = a1+a2 , S3 = a1+a2 +a3;  原数列改变后新的累加和为: S1' = a1+a2 , S2' = S1' + (- a2) = a1 , S3 = S2' + (a2+a3) = a1+a2+a3;

可见新的累加和只是将原来累加和的前两个交换了位置而已, 在中间位置的三个数的操作对累加和数列的改变也是一样的。

所以我们就将原来的操作用在累加和上的相邻数交换位置来代替;

于是原来的判定问题变为: 初始序列的累加和序列可否通过一系列的交换操作转换为目标序列的累加和序列?

而后者的判定是容易的,将两个序列排序之后比较是否全一致就是了~这是因为假设我们有一个排序后的序列S,那么初始序列跟目标序列都可以通过操作转换为这个序列S,那么明显初始序列可以先转换为序列S,再通过逆操作转换为目标序列。

所以算法是O(nlogn)的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值