NYOJ109 数列转换 【守恒法】

数列转换

时间限制: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

样例输入
2
3
1 2 3
1 3 2
6
1 6 9 4 2 0
7 -6 19 2 -6 6
样例输出
No
Yes
来源
《世界大学生程序设计竞赛高级教程·第一册》
上传者
张云聪

题解:如果用暴力模拟出所有结果然后再比较的话很容易超时,而且编程复杂度高,但是在网上看到了一个很神奇的守恒法,不是在细节上关注这些变化,而是从整体上看到某些不变的东西,用S[i]表示A[0...i]的和,当对A[i]进行变化的时候,直接结果是S[i]和S[i-1]交换了位置,所以为题就转换成了求S数组,排序,然后比较两个S数组是否相等。

#include <stdio.h>
#include <string.h>
#include <algorithm>

#define maxn 1010

int A[maxn], B[maxn];

int main() {
    int t, n, i;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &n);
        for(i = 0; i < n; ++i) {
            scanf("%d", &A[i]);
            if(i) A[i] += A[i-1];
        }
        for(i = 0; i < n; ++i) {
            scanf("%d", &B[i]);
            if(i) B[i] += B[i-1];
        }
        std::sort(A, A + n);
        std::sort(B, B + n);
        if(std::equal(A, A + n, B))
            printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
时间: 2024-08-02 08:17:19

NYOJ109 数列转换 【守恒法】的相关文章

【C语言】求斐波那契(Fibonacci)数列通项(递归法、非递归法)

意大利的数学家列昂那多·斐波那契在1202年研究兔子产崽问题时发现了此数列.设一对大兔子每月生一对小兔子,每对新生兔在出生一个月后又下崽,假若兔子都不死亡.   问:一对兔子,一年能繁殖成多少对兔子?题中本质上有两类兔子:一类是能生殖的兔子,简称为大兔子:新生的兔子不能生殖,简称为小兔子:小兔子一个月就长成大兔子.求的是大兔子与小兔子的总和. 月     份  ⅠⅡ  Ⅲ  Ⅳ  Ⅴ Ⅵ  Ⅶ  Ⅷ Ⅸ Ⅹ  Ⅺ  Ⅻ大兔对数 1  1   2   3   5  8  13  21 34 55 

剑指Offer面试题9(java版)斐波那契数列

题目一:写一个函数,输入n,求斐波那契数列的第n项.斐波那契数列的定义如下: 1.效率很低效的解法,挑剔的面试官不会喜欢 很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,因此很多的应聘者对这道题的递归解法都很熟悉. 下面是实现代码 我们教科书上反复用这个问题来讲解递归的函数,并不能说明递归的解法最适合这道题目.面试官会提示我们上述递归的解法有很严重的效率问题要求我们分析原因. 我们以求解f(10)为例来分析递归的求解过程.想求得f(10),需要先求出f(9)和f(8).

[转]递归算法

原文地址:http://blog.csdn.net/wangjinyu501/article/details/8248492 一.基本概念 递归算法是一种直接或者间接调用自身函数或者方法的算法.Java递归算法是基于Java语言实现的递归算法.递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解.递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解.递归算法,其实说白了,就是程序的自身调用.它表现在一段程序中往往会遇到调用自身的那样一种coding策略,这

【转】国家集训队论文分类整理 作者:洪雁书

距离NOI时间越来越少了,选择性地看一些集训队论文是很有必要的. (在此给已经看过所有论文的神牛跪了= =) 所以,我在此整理了一下,供大家参考. 组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪

【资料】国家集训队论文集(1999~2014)

本文版权归ACShiryu和acvay所有,如转载请注明原作者. 国家集训队1999论文集 1.陈宏:<数据结构的选择与算法效率--从IOI98试题PICTURE谈起> 2.来煜坤:<把握本质,灵活运用--动态规划的深入探讨> 3.齐鑫:<搜索方法中的剪枝优化> 4.邵铮:<数学模型的建立.比较和应用> 5.石润婷:<隐蔽化.多维化.开放化--论当今信息学竞赛中数学建模的灵活性> 6.杨帆:<准确性.全面性.美观性--测试数据设计中的三要素

国家集训队论文

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

国家集训队论文整理分类

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

国家队论文集

组合数学 计数与统计 2001 - 符文杰:<Pólya原理及其应用> 2003 - 许智磊:<浅谈补集转化思想在统计问题中的应用> 2007 - 周冬:<生成树的计数及其应用> 2008 - 陈瑜希<Pólya计数法的应用> 数位问题 2009 - 高逸涵<数位计数问题解法研究> 2009 - 刘聪<浅谈数位类统计问题> 动态统计 2004 - 薛矛:<解决动态统计问题的两把利刃> 2007 - 余江伟:<如何解决

遥望布达拉——DAY14 左贡-邦达

老陈终于在昨天也赶到了左贡,队伍再次聚齐.因为是县城,早餐的选择也多了,果断吃了好久没见的油条豆浆. 出门不久就遇到一个巨大的积满水的泥坑,好吧,只能选择扛车从旁边的水泥台上过. 昨天得到的情报是前60km都是烂路,不出意外我又落到了队伍最后.今天从出发就听见前轮一直有响声,不知道怎么回事. 前面小单非要找个地方搞大,那我正好也检查检查是哪出问题,结果问题没检查出来,手贱动了码表动的不走字了,要知道码表可是骑车人多重要珍贵的东西,罢了罢了,忍一忍算了. 等了他十几分钟,李怀小卢老陈和大鹏组成第一