数列转换
-
描述
-
有一个数列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
-
第一行是一个正整数N,表示测试数据的组数。(N<=100)
这个问题一眼看上去信息量很大,让我有点犯难,用了常规的办法去做,但是WA,后来查了算法书才知道其实用到了STL,C++有一个equal函数,存在algorithm头文件中,问题立马变的和A+B一样简单了!
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001],b[1001];
int main()
{
int n,m,i;
cin>>n;
while(n--)
{
cin>>m;
for(i=0;i<m;i++)
{
cin>>a[i];
a[i]=a[i]+a[i-1];
}
for(i=0;i<m;i++)
{
cin>>b[i];
b[i]=b[i]+b[i-1];
}
sort(a,a+m);
sort(b,b+m);
if(equal(a,a+m-1,b))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
错误代码:
#include<iostream>
using namespace std;
int a[1001],b[1001];
int main()
{
int n,m,i,t;
cin>>n;
while(n--)
{
cin>>m;
for(i=0;i<m;i++)
cin>>a[i];
for(i=0;i<m;i++)
cin>>b[i];
for(i=1,t=0;i<=m-2;i++)
{
if(a[i-1]==b[i-1])
continue;
else if(a[i-1]+a[i]==b[i-1])
{
a[i-1]+=a[i];
a[i]=-a[i];
a[i+1]+=a[i];
}
else
{
t=1;
break;
}
}
if(t==0)
cout<<"Yes\n"<<endl;
else
cout<<"No\n"<<endl;
}
}