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

被折叠的 条评论
为什么被折叠?



