Codeforces Round #649 (Div. 2)。A。

题意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;后者会超时,后者的占用空间大,然后卡了我一个多小时,脏话。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值