Codeforces Round #649 (Div. 2) A. XXXXX
题目链接:A、XXXXX
题意:
给你长度为n的数组,你需要从中找到最长的子数组(相当于子串得概念)。这个子数组要保证它的所有元素的和不能被x整除。如果找不到就输出-1
题解:
如果n个元素都可以被x整除,那就输出-1
否则,如果n个元素的和不可以被整除就输出n,否则我们只需要取 从开头处找到距离数组首部最近的那个不能被x整除的元素就可以了,从结尾处找到距离数组尾部最近的那个不能被x整除的元素就可以了
中哪个元素距离数组某一端更近的那个距离输出就可
代码:
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string> 5 #include<queue> 6 #include<string.h> 7 #include<map> 8 #include <iostream> 9 #include <math.h> 10 using namespace std; 11 typedef long long ll; 12 const int maxn=1e5+10; 13 int n,m,v[maxn]; 14 int main() 15 { 16 int t; 17 scanf("%d",&t); 18 while(t--) 19 { 20 int sum=0,num=0; 21 scanf("%d%d",&n,&m); 22 for(int i=0;i<n;++i) 23 { 24 scanf("%d",&v[i]); 25 sum+=v[i]%m; 26 } 27 if(sum==0) 28 printf("-1\n"); 29 else if(sum%m) 30 { 31 printf("%d\n",n); 32 } 33 else 34 { 35 int l=0,r=n; 36 while(v[l]%m==0) l++; 37 while(v[r-1]%m==0) r--; 38 l++; 39 r--; 40 printf("%d\n",max(n-l,r)); 41 } 42 } 43 return 0; 44 }