nyoj761 Magic Pen 6 hdu4648

Magic Pen

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述

一次偶然的机会,LYH得到了一支Magic Pen

学期结束时,A老师交给LYH一个任务:把N个不及格同学的名单和成绩交给B老师。而这里面有好多人都是LYH的朋友,所以为了“救”他们,他决定用他的Magic Pen划去一部分同学的名字。可是,B老师已经知道了这N个同学的总成绩对M取余后的结果。为了不让B老师发现任何可疑的地方,LYH必须保证剩下的同学的总成绩对M取余后的结果等于N个同学的总成绩对M取余后的结果。聪明的你能告诉LYH最多能划去多少个同学的名字吗?

输入
有T组测试数据( T<=200)。
每组数据第一行输入两个整数N和M(0<N<=1000,0<M<10003);
第二行包含N个整数a1,a2,a3,···an(-100<=a1,a2,···an<=100),ai表示第i个同学的成绩。
(注意:Magic Pen只能使用一次且只能划去连续的名字,成绩可以是负数。)
输出
输出最多能划去多少个同学的名字。
样例输入
3
2 3
1 6
3 3
2 3 6
2 5
1 3
样例输出
1
2
0
来源
hdu改编
上传者
#include <stdio.h>
#include <string.h> 
const int maxn = 100000 + 5;

int dp[maxn];
int hs[maxn];

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n, m;
    	scanf("%d%d", &n, &m);
        memset(hs,-1,sizeof(hs));
        for (int i = 1; i <= n; i++)
        scanf("%d", &dp[i]);
        
        hs[0] = 0;
        int MAX = 0;
        for (int i = 1; i <= n; i++) //遍历所有数值 
        {
            dp[i] += dp[i-1];
            dp[i] %= m;
            if(dp[i] < 0 )
            dp[i] = m + dp[i];
                
            if(hs[dp[i]] != -1)
            {
               if(i - hs[dp[i]]  > MAX)
                MAX = i - hs[dp[i]];
            }
            else
            {
               hs[dp[i]] = i;
            }
        }
        printf("%d\n", MAX);
	}
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值