现在的位置: 首页 > 综合 > 正文

[这个算是找规律???]一序列

2013年05月18日 ⁄ 综合 ⁄ 共 977字 ⁄ 字号 评论关闭

【题目】

如果一个以0开头的整数序列任意两个相邻的项相差为1或-1,则我们说这个整数序列是‘一序列’。更清楚的,如果序列[a1,a2,……an]满足以下条件,则是一个一序列。

1、对于任何的k,1<=k<n ,满足|ak-ak+1|=1

2、a1=0。

1、从输入文件中读入序列的长度和序列的总和。

2、找出一个给定长度的序列,使它的总和等于给定的值。

3、将结果写入输出文件

【输入】

输入文件第一行是一个整数n,1<=n<=100,0000,表示序列的长度,第二行包含一个整数s,|s|<=50000000,表示序列的总和。

【输出】

如果这样的序列不存在,则输出‘NIE’。否则,输出n个数,表示所求的序列,n个数的和等于s。

【样例输入】

8

4

【样例输出】

0

1

2

1

0

-1

0

1

【分析】

首先说明,这个题目是多解的。

很懒了啦~ 粘别人的题解来咯。

不难想到n个数和的最大值与最小值分别为n*(n-1)div 2 -n*(n-1)div2,设MAX表示最大值,那么最小值为-MAX。显然,如果S不在-MAXMAX的范围内,本题一定无解。而且由于相邻两个数的差为1,所以数列应该是偶、奇、偶、奇、……这样排列,因此n个数的和的奇偶情况应该是一定的,如果SMAX不是同偶或同奇该问题也无解。

接下来我们该考虑如何构造数列。当N=4时将所有的数列按和从大到小排列如下:

01 2 3 ),

01 2 1),

01 0 1),

0–1 0 1),

0–1 0 –1),

0–1 –2 –1

0–1 –2 –3

我们可以看到,这些数列间存在一些规律。假设(01 23)为初始数列,从最后一个数开始,从后往前每次将一个数减二,一直减到数列中的第2个数,接着再次从最后一个数开始减,一直减到数列中的第3个数。最后仍然从最后一个数开始,一直减到数列中的第n个数。按这种方法使得数列的和每次减二,可以产生出所有的数列。这种方法也可以推广到一般的情况,假设数列中有n个数,且初始数列为(012……n),每一轮从第n个数开始减起,每次将一个数减二,生成一个新的数列,第I轮要减到数列中的第I+1个数,总共要减n-1轮,这样可以按总和从大到小的顺序产生出所有的数列。分析到这我们也可以证明如果输入的整数S-MAXMAX的范围内且SMAX同奇偶,该问题一定有解。

题解结束。代码什么的,恩。很好实现……忽略(我不是没写的说!!!)。


【上篇】
【下篇】

抱歉!评论已关闭.