nyoj109 数列转换

题目:点击打开链接


理解:有的题目,一看就应该是模拟,而有的题目规律性很强,我们看这道题是从(an-1,an,an+1)转化到(an-1+an,-an,an-1+an),三个数的和是不变的。

那我们就想到是否数列额总和一样,两个数列就可以互达呢?

在我们下结论之前肯定要举几个例子,验证一下。

好现在考虑(1 2 3)(1 3 2)

(1 2 3)(3,-2,5)(1 2 3)所以这个想法是不行的

总和虽然不行,我们可以试着考察局部和(即前n项和)

(an-1,an,an+1)  (an-1+an,-an,an-1+an)

Sn-1=an-1      S’n-1=an-1+an

Sn=an-1+an    S’n=an-1

Sn=an-1+an+an+1    S’n+1=an-1+an+an+1

可以看到前后两个数列的前两项是位置是相反的,最后一个位置是不变的。

很容易的,我们推广一下:Sn=a1+a2+a3+...+an-1+an,那么题述规则就是相当于交换Sn-1.Sn,也就是说,两个数列,分别求前n项和,排序后,看是否对应相等。

 

总结:这就是对题目理解的熟练度,做的多了,自然会想到求和,综合不行,就考虑部分和,这里也体现了守恒的思想。对于数列判等的,系统提供了一个equal函数。

 

上码:

#include<iostream>
#include<algorithm>
 
using namespace std;
 
int S[1002], E[1002];
 
int main() {
int nCase, n;
cin >> nCase;
 
while (nCase--) {
cin >> n;
 
for (int i = 1; i <= n; i++) {
cin >> S[i];
S[i] += S[i - 1];
}
 
for (int i = 1; i <= n; i++) {
cin >> E[i];
E[i] += E[i - 1];
}
 
sort(S + 1, S + n + 1);
sort(E + 1, E + n + 1);
equal(E + 1, E + n + 1, S + 1) ? cout << "Yes" << endl : cout << "No" << endl;
 
}
 
return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值