- 难度:3内存限制:64MB 时间限制:3000ms 特判: No
- 通过数:9 提交数:15
-
- 题目描述:
有一个数列a1,a2,a3...an,每次可以从中任意选三个相邻的数ai-1 ,ai , ai+1 ,进行如下操作(此操作称为“对ai进行操作”)
(ai-1,ai,ai+1)->(ai-1+ai,-ai,ai+ai+1)
给定初始和目标序列,是否能通过以上操作,将初始序列转换成为目标序列?例如,初始序列(1 6 9 4 2 0)目标序列(7 -6 19 2 -6 6)可经过如下操作:
(1 6 9 4 2 0)->( 1 6 13 -4 6 0)->(1 6 13 2 -6 6)->(7 -6 19 2 -6 6)
请你判断给定的初始状态和目标状态,输出Yes(能够转换)或No(不能转换)
输入描述:
第一行是一个正整数N,表示测试数据的组数。(N<=100) 每组测试数据的第一行是一个整数M(3<=M<=1000),表示该组测试数据的起始状态与结束状态都有M个数。 每组测试数据的第二行是M个整数Ai(-1000<=Ai<=1000),表示起始状态。 每组测试数据的第三行是M个整数Bi(-1000<=Bi<=1000),表示终止状态。
输出描述:
如果能够转换,输出Yes 如果不能转换,输出No
样例输入:
复制
2 3 1 2 3 1 3 2 6 1 6 9 4 2 0 7 -6 19 2 -6 6
样例输出:
No Yes
- 题目描述:
- 思路分析:要能达到目的那么两个序列相同,这意味着两个序列的总和是相等的,但从第一个输入数据看光总和相等还不能完全判断这两个序列相等,那么就要来看它里面每进行一次运算后,变化后的序列是否与目标序列相同。
- AC代码:
#include <iostream> #include<algorithm> using namespace std; int a[1001],b[1001]; int main() { int n,m; cin>>n; while(n--) { cin>>m; for(int i=1; i<=m; i++) { cin>>a[i]; a[i]+=a[i-1]; } for(int i=1; i<=m; i++) { cin>>b[i]; b[i]+=b[i-1]; } sort(a+1,a+m); sort(b+1,b+m); if(equal(a+1,a+m,b+1))cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
11-15
140
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)