我叫张小黑
张小黑的挣扎生活
posts - 66,  comments - 109,  trackbacks - 0

在poi的列表上是easy。。。。
我倒。。这也easy。。。。。。
这道题多亏了javaman。。呵呵。。这一次。。他讲的挺清楚的。。。谢谢他一下

题目大意:
      根据输入,序列的长度,序列和,求这样一串序列
      序列满足以下情况:

  • for any k, such that 1 <= k < n : |ak - ak+1| = 1 and
  • a1 = 0

  如果没有如此序列则输出"No"

我们假设n-->序列长度,S-->序列和;

S=sigma a[i](1<=i<=n)
令bi=a[i+1]-a[i] (1<=i<n)

S=sigama b[i]+sigama a[i] (1<=i<n) ----> S= sgama (n-i)b[i]; (1<=i<n)//迭代加一下就能推出来

b[i]-->-1 or 1

S=sigama (n-i)(b[i]+1)-sigama(n-i)
   =2*sigama ((n-i)(b[i]+1)/2)  -  n*(n-1)/2

d[i]=(b[i]+1)/2-->0 or 1
根据上式得:
no-->
1: S+n*(n-1)/2 为奇数
2: abs(S)>n*(n-1)/2  //important ....我就是这里一直错...绝对值...没考虑....

#include<iostream>
#include
<math.h>
int N,S;
int main()
{
    
int std,i,d,pre;
    
int T;
    scanf(
"%d",&T);
    
for(int j=1;j<=T;j++)
    {
        scanf(
"%d%d",&N,&S);
        std
=(N*(N-1))/2;
        
if((S+std)%2||abs(S)>std)
        {
            printf(
"No\n");
            
if(j!=T)printf("\n");
            continue;
        }
        printf(
"0\n");
        
for(pre=0,std+=S,std/=2,i=1;i<N;i++)
        {
            
if(std>=N-i)
            {    
                d
=1;
                std
-=N-i;
            }
            
else d=0;
            printf(
"%d\n",pre=2*d-1+pre);
        }
        
if(j!=T)printf("\n");
    }
    return 
0;
}
posted on 2008-07-12 12:08 zoyi 阅读(477) 评论(1)  编辑 收藏 引用 所属分类: acm数学

FeedBack:
# re: spoj Sum of one-sequence
2009-08-26 23:12 | Nimo
那后面怎么做啊,你只讲了判断"No";啦 ,哪"Yes"呢  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


欢迎光临 我的白菜菜园

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(8)

随笔分类

随笔档案

文章档案

相册

acmer

online judge

队友

技术

朋友

搜索

  •  

最新评论

阅读排行榜

评论排行榜