Tokitsukaze and Multiple(三,学习总结)

本文介绍了一种使用贪心算法解决特定数学问题的方法:给定一个整数序列和一个整数p,通过允许序列中任意两数进行无限次相加操作,目标是找出操作后序列中p的倍数的最大可能数量。文章详细解释了算法的实现思路,包括如何利用求模运算和贪心策略来高效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
题意: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 <bits/stdc++.h>
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值