贪心:依次遍历,能切就切。
思路:对于每个数a[i],向左寻找端点,能找到答案加一同时清空用来存待切数段的set,重新开始。
示例:第一行——a数组 第二行——前缀和 第三行——前缀和余k
余数出现相同,则可以切了,如图21-5=16 16%4=0
结合代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int kn[N],a[N];
set<int> s;
signed main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>kn[i];
a[i]=kn[i]+a[i-1]; //前缀和
}
int ans=0;
for(int i=1;i<=n;i++){
s.insert(a[i-1]%k); //set存储当前待切数段
if(s.count(a[i]%k)){ //如果数段可切了
ans++;
s.clear(); //贪心,清空数段,重新计算
}
}
cout<<ans;
return 0;
}