Tokitsukaze and Multiple(三,学习总结)

Tokitsukaze and Multiple(三,学习总结)_第1张图片
题意:n个数,相邻两数可经过无限次相加,求经过操作后该数列中是p的倍数的数的最多个数。
思路:利用贪心算法,从左至右判断,如果一个区间之中存在操作后求模p的两个值相等,那么这个区间就一定存在加起来是p的倍数的数,,因为只有加上p的倍数才会使其求模后不变。m=n%p=(n+k*p)%p.
cin与cout的使用注意加入ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);

#include 
using namespace std;
const int maxn = 1e5+10; 
int v[maxn];
map<int,int> mp;
int sum,j,x;
int main(){
	ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
	int tcase,n,p,ans;
	cin>>tcase;
	while(tcase--){
		cin>>n>>p;
		mp[0]=1;
		sum=0;
		ans=0;
		for(int i=0;i<n;i++){
		   cin>>x;
		   sum=(sum + x) % p;
		  if(mp.count(sum)){//count()返回指定元素sum出现的次数
		  	ans++;
		  	sum=0;
		  	mp.clear();
		  	mp[0]=1;
		  }
		  else{
		  	mp[sum]=1;
		  }
		}
		v[j++]=ans;
		mp.clear(); 
	}
	for(int i=0;i<j;i++){
		cout<<v[i]<<endl;
	}
		return 0;
}

你可能感兴趣的:(Tokitsukaze and Multiple(三,学习总结))