地址:http://codeforces.com/enter?back=%2Fcontest%2F1374%2Fproblem%2FD
题意:
n个数,k
x初始为0,
操作1:+ai,x++
操作2:x++
问使得所有数均能整除k的最小操作数。每个数只能被加一次。
解析:
假设有俩数:2 2
k=6
第一个2,+4即可,但是第二个2,需要+10
即为4+k
加的数,%k是有周期性的。
每个数能整除k所需要的最小步数为:md=k-ai%k
最小步数相同,实际上它们就是一类,只是处于不同的周期里。
出现次数最多的md,就是需要循环的次数,比它出现次数小的,在之前的循环里就已经解决。
用map来记录这个最大次数
#include<cstdio> #include<map> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int maxn=2e5+10; int main() { // 4 0 20 int t; cin>>t; while(t--) { ll n,k; cin>>n>>k; ll maxx=0; map<ll,ll>mp; for(int i=1;i<=n;i++) { ll x; cin>>x; if(x%k==0) continue; ll md=k-x%k; if(mp.count(md)) { mp[md]+=k; maxx=max(maxx,mp[md]); } else { mp[md]=md; maxx=max(maxx,mp[md]); } } if(maxx==0) cout<<"0"<<endl; else cout<<maxx+1<<endl; } }