题意t种情况,数组a的长度为n,然后数组的和不能被n整除,问a的长度,可以从前或者后面进行计算。
题解:两个思路:1.使用双指针,代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int main(){
int a[maxn],b[maxn];
int t,x,n;
cin>>t;
while(t--){
int ans=0,d=0;
cin>>n>>x;
int ans1;
for(int i=0;i<n;i++){
cin>>a[i];
ans=ans+a[i];
}
ans1=ans;
if(ans%x){
cout<<n<<endl;
continue;
}
for(int i = n - 1, j = 0; i >= j; i--, j++) {
if((ans - a[i]) % x) {
cout << n - j - 1 << endl;
d = 1;
break;
}else {
ans -= a[i];
}
if((ans1 - a[j]) % x) {
cout << n - j - 1 << endl;
d = 1;
break;
}
ans1-= a[j];
}
if(d==0) {
cout << "-1" << endl;
}
}
return 0;
}
2.在输入的时候计算一种情况。在输入的时候计算从后向前删除的情况。
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;
int main(){
int a[maxn],b[maxn];
int t,x,n;
cin>>t;
while(t--){
int ans=0;
cin>>n>>x;
int ans1,ans2,n1=n,n2=0;
for(int i=0;i<n;i++){
cin>>a[i];
ans=ans+a[i];
if(ans%x!=0){
n2=i;
}
}
if(n2!=0){
n2=n2+1;
}
if(ans%x!=0){
cout<<n<<endl;
continue;
}
else{
ans1=ans;
for(int i=0;i<n;i++){
ans1=ans1-a[i];
if(ans1%x!=0){
n1=n1-1;
break;
}
else{
n1=n1-1;
}
}
if(n1==0&&n2==0)printf("-1\n");
else{
if(n1>n2)printf("%d\n",n1);
else printf("%d\n",n2);
}
}
}
return 0;
}
其实两种思路都是只循环一次,最后,它的数组大小设定只能是const int maxn=1e5+10,不能是const int maxn=10010;后者会超时,后者的占用空间大,然后卡了我一个多小时,脏话。