nyoj 109 数列转换

来源:互联网 发布:淘宝买身份证 编辑:程序博客网 时间:2024/04/30 12:16

数列转换

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

有一个数列a1,a2,a3...an,每次可以从中任意选三个相邻的数ai-1 ,a, 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
样例输入
231 2 31 3 261 6 9 4 2 07 -6 19 2 -6 6
样例输出
NoYes
来源
《世界大学生程序设计竞赛高级教程·第一册》
上传者

张云聪


证明请看链接:http://blog.csdn.net/xianququxian/article/details/5071657

代码:

#include<string.h>#include<stdio.h>#include<algorithm>#include<math.h>using namespace std;int a[1010],b[1010];int main(){    int t,n,sum,x,i,bj;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        sum=0;        for(i=0;i<n;i++)        {            scanf("%d",&x);            sum+=x;            a[i]=sum;        }        sum=0;        for(i=0;i<n;i++)        {            scanf("%d",&x);            sum+=x;            b[i]=sum;        }        sort(a,a+n);        sort(b,b+n);        bj=0;        for(i=0;i<n;i++)        {if(a[i]!=b[i])        {            bj=1;            break;        }        }        if(bj==0)            printf("Yes\n");        else            printf("No\n");    }}


0 0