【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108444
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

输入n个自然数(也就是正整数) ( N <= 10000 ),并且都不超过15000。可能有重复。你的任务是从中选择其中一些数,( 1 <= 个数<= N ),令到选择的这些数的和等于N的倍数。即N*K=选择的数的和,K为某一自然数。

input:
首行为N,以下N行为指定的数。

output:
假如你认为没有可行的答案,则输出0。否则首行输出选择的数的个数。以下一行一个输出每个数,按任意顺序即可。

input:
5
1
2
3
4
1

output:
2
2
3

分析:
      用sum[i]表示1到i的总和,如果sum[i]%n==0则1到i是一个解;如果sum[i]和sum[j]同时%n,且值相同则i+1到j则一定是一个解。

【参考程序】:
#include<iostream>
using namespace std;
int n,bx,by,ans;
int sum[10001],a[10001];
void work(int x,int y)
{
    bx
=x;by=y;ans=by-bx+1;
}
int main()
{
    scanf(
"%d",&n);
    memset(sum,
0,sizeof(sum));
    ans
=0xFFFFFFF;
    
for (int i=1;i<=n;i++)
    {
        scanf(
"%d",&a[i]);
        sum[i]
=(sum[i-1]+a[i])%n;
        
if (!sum[i]) work(1,i);
    }
    
for (int i=1;i<=n-1;i++)
        
for (int j=i+1;j<=n;j++)
            
if (sum[i]==sum[j]) //sum[i]%n==sum[j]%n
                work(i+1,j);
    
if (ans==0xFFFFFFF) printf("0\n");
    
else 
    {
        printf(
"%d\n",ans);
        
for (int i=bx;i<=by;i++) printf("%d\n",a[i]);
    }
    
return 0;
}
posted on 2009-06-13 21:02 开拓者 阅读(131) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

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