nyoj 109 数列转换(equal函数STL)

来源:互联网 发布:微盘软件下载 编辑:程序博客网 时间:2024/05/21 09:45

微笑数列转换

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

有一个数列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
样例输入
231 2 31 3 261 6 9 4 2 07 -6 19 2 -6 6
样例输出
NoYes

这个问题一眼看上去信息量很大,让我有点犯难,用了常规的办法去做,但是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;
    }
}

 

原创粉丝点击