hdu 4648(dp)

点击打开链接


题意:

给你n个数,要求删去最多连续的数字,使剩下的数对m的余数不变。


可以想到使删去的连续数字和为m的倍数就可以了。也就是去最长连续和是的m的倍数。

可以求出A[i],表示从第一个数到第i个数的和对m的余数,

当出现同余的时候,两个同余之间的数肯定是m的倍数,

注意处理负数,先对输入的数%m,在(..+m)%m,

还要处理余数为0的情况,这时候要单独判断。


#include"stdio.h"
#include"string.h"
#define N 10005

int A[N];
int main()
{
	int a;
	int n,m;
	int i,t;
	int ans;
	while(scanf("%d%d",&n,&m)!=-1)
	{
		memset(A,-1,sizeof(A));
		t=0;
		ans=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a);
			a%=m;
			a=(a+m)%m;
			t+=a;
			t%=m;
			if(t==0)
			{
				if(i>ans)ans=i;
				continue;
			}
			if(A[t]!=-1)
			{
				if(i-A[t]>ans)ans=i-A[t];
			}
			else A[t]=i;
		}
		printf("%d\n",ans);
	}
	return 0;
}



你可能感兴趣的:(HDU,多校联赛5,最长连续和是m的倍数)