posts - 0,comments - 0,trackbacks - 0
跟那个博弈题一样,是个没想出来非常狠,想出来又非常水的题。。果断看题解。。
从第一个数开始计算起,如果到第a个数,所有的和mod n的数字已经出现过,上次出现的点和这次的点之间的连续的数的和一定能被n整除(2个余数一样,一减不就是N的倍数么),所以,只要记录连续数的和除以N的余数就行。一旦发现重复的,就输出两个重复的之间的那段数字。因为有n个数,所以总能得到解。
PS:不是说选择性的选不能得到结果,而是题目只要解,没要最优解,而搜索的复杂度又太大,所
#include<stdio.h>
long n,i,j,sum;
long bj[15001];
long v[10001];
int main()
{
  scanf(
"%ld",&n);
  
for (i=1;i<=n;i++)
  {
    bj[i]
=-1;
    scanf(
"%ld",&v[i]);
  }
  bj[
0]=0;
  
for (i=1;i<=n;i++)
  {
    sum
+=v[i];
    
if (bj[sum%n]==-1)
      bj[sum
%n]=i;
    
else 
    {
      printf(
"%ld\n",i-bj[sum%n]);
      
for (j=bj[sum%n]+1;j<=i;j++)
        printf(
"%ld\n",v[j]);
      
return 0;
    }
  }
}
以上述是最好的解法。
posted on 2011-07-05 23:21 梦转千寻 阅读(57) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理