寻找数列(构造+拓扑)

寻找一个有n个整数的数列,满足下列条件:

其中任意连续p个数之和是正数。

其中任意连续q个数之和是负数。

若无法找到,则输出"No",否则输出一个数值最小的数列。

输入  n  p  q

输出  n个整数

 

样例:

输入:

5 4 3

输出:

2 2 -5 2 2

 

 

 

 

设: si——数列前i个数之和。

所以有

s[i]=a[1]+a[2]+...+a[i]

s[0]=0;

 

s[i+p]-s[i]>0 s[i+p]>s[i]

s[i+q]-s[i]<0 s[i+q]<s[i]

构图:

点——i (0..n)

权——s[i]

边——当s[i]>s[j]时 有(i,j)

 

如n,p,q=6,5,3

 

s[i]>s[i+3]

s[i+5]>s[i]

拓扑号: 0 1 2 3   4   5  6

            2 5 0 3   6   1  4

                  ↑ 这个我们知道。  而要最小、 所以往前一次递增,往后依次递减。

 s[i]  : 2 1 0 -1 -2 -3  -4

 

a[i]=s[i]-s[i-1]: 1  2  3  4  5  6

                      -3 5 -3 -3  5 -3

 

 

Code

 

 

posted @ 2009-11-22 22:16  末日凌晨 散步的猫 ##  阅读(285)  评论(0编辑  收藏  举报