题意是在左边选几个数,让和是N的倍数,输出第一行是选的数的个数。
开始想的是把每个数的关于N的余数求出来,然后转化成一个n个数之和为N的背包问题,,,,但是很明显,,,,N的倍数也是可以的。。。。
比如这组
5
3
1
3
3
3
HINT放到最后了、、、、、还有要注意输出的是数最少的那组!!!!而不是随心所欲!!!!!
华丽丽的WA。。。。
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
int a[100001]={0};
int q[100001]={0};
int main()
{
int m;
scanf("%d",&m);
int i,j,k;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
int minn=999999;
int sum;
for(i=0;i<m;i++)
{
sum=0;
for(j=i;j<m;j++)
{
sum+=a[j];
//printf("sum=%d\n",sum);
if(sum%m==0)
{
//printf("****\n");
if(minn>j-i)
{
minn=j-i+1;
int t=0;
for(k=i;k<=j;k++) q[t++]=a[k];
}
break;
}
}
}
if(m==1) printf("1\n%d\n",a[0]);
else if(minn>99999) printf("0\n");
else
{
printf("%d\n",minn);
for(i=0;i<minn;i++) printf("%d\n",q[i]);
}
return 0;
}
/*
这个题目有如下性质:一定存在一个满足条件的连续数列!理由如下:我们用Sum[k]记录数
列的前k个元素之和mod n的值。如果Sum[k]=0,搞定。如果不为0,由抽屉原则,必存在Sum[a]=Sum
[b],a<>b。不妨假设a<b,那么我们选择序列a+1到b,一定满足要求。
*/