Codeforces Round #653 (Div. 3)D. Zero Remainder Array
Posted liyexin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #653 (Div. 3)D. Zero Remainder Array相关的知识,希望对你有一定的参考价值。
地址: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; } }
以上是关于Codeforces Round #653 (Div. 3)D. Zero Remainder Array的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #653 (Div. 3)ABCDE1
Codeforces Round #653 (Div. 3)D. Zero Remainder Array
Codeforces Round #653 (Div. 3) B. Multiply by 2, divide by 6 (数学)
Codeforces Round #436 E. Fire(背包dp+输出路径)