109-数列转换(nyoj)

  •  难度: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;
    }
    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值