nyoj109 数列转换

来源:互联网 发布:软件管理器官方下载 编辑:程序博客网 时间:2024/05/18 04:08

题目:点击打开链接


理解:有的题目,一看就应该是模拟,而有的题目规律性很强,我们看这道题是从(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;}


0 0