题目大意:
一共有有t组案例,且每个案例都有一个数字x和长度为n的数组,找出最短的子数组,使得子数组所有元素的和不能整除x。如果存在这样的子数组那么输出它的长度,若不存在这样的子数组输出-1。
思路:
首先考虑两种极端情况,第一种:数组中每个元素都可以整除x,即没有满足条件的子数组,因此输出-1;第二种:原数组的元素和本来就不能整除x,即原数组就满足条件,因此输出原数组长度n。再考虑一般情况:原数列和能整除x,因此我们就要从数组左右两端删除一个元素使它满足题意。而这个元素一定是不能整除x的,因为原数组的和是可以整除x的,所以要满足子数组长度最长可以先只删一个元素,若只删一个元素不行则以此类推。
AC:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n,x,sum=0,l=-1,r;
scanf("%d%d",&n,&x);
for (int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
if (a%x)
{
if (l==-1)
l=i;
r=i;
}
sum+=a;
}
if (sum%x)
printf("%d\n",n);
else if (l==-1)
printf("-1\n");
else
printf("%d\n",n-min(l+1,n-r));
}
}