[codeforces 1364A] XXXXX 余数的拆分

Codeforces Round #649 (Div. 2)  参与排名人数11286

[codeforces 1364A]   XXXXX   余数的拆分

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1364/problem/A

ProblemLangVerdictTimeMemory
A - XXXXX GNU C++17Accepted124 ms600 KB

题目大意:将数组a自头删除连续元素(也可不删除元素),或自尾删除连续元素(也可不删除元素),或同时自头自尾删除连续元素(也可不删除元素),得到数组b,若b中连续的元素和不能整除x,求出连续元素的最大个数。

余数是0,可拆分为两个余数不为0.

样例分析如下

2 2
0 6

-1

a数组位置    1 2
a数组数值    0 6
a[i]%x      0 0
前缀和sum[i] 0 0

sum[2]==0
此种情况需特判
输出-1

3 4
1 2 3

3

a数组位置    1 2 3
a数组数值    1 2 3
a[i]%x      1 2 3
前缀和sum[i] 1 3 6

sum[3]%x!=0
此种情况需特判
输出3

3 3
1 2 3

3

a数组位置    1 2 3
a数组数值    1 2 3
a[i]%x      1 2 0
前缀和sum[i] 1 3 3

sum[3]%x==0

输出3

3 4
1 2 3

2


a数组位置    1 2 3
a数组数值    1 2 3
a[i]%x      1 2 3
前缀和sum[i] 1 3 6

sum[3]%x==0
此种情况可考虑找到sum[i]%x!=0,那么区间
[1,i],[i+1,n]内的连续和均不被x整除

AC代码如下

#include <cstdio>
#include <algorithm>
#define maxn 100010
using namespace std;
int a,sum[maxn];
void solve(){
	int n,x,i,ans=-1;
	scanf("%d%d",&n,&x);
	for(i=1;i<=n;i++)scanf("%d",&a),a%=x,sum[i]=sum[i-1]+a;
	if(sum[n]==0){printf("-1\n");return;}//特判,每个a[i]全能整除x
	if(sum[n]%x){printf("%d\n",n);return;}//特判,整串均不能整除x
	for(i=1;i<=n;i++)//[1,n]区间的和能整除x
		if(sum[i]%x)ans=max(ans,i),ans=max(ans,n-i);//[1,i],[i+1,n]区间内的和均不能被x整除
	printf("%d\n",ans);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--)solve();
	return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值