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;
    }
}

 

posted @ 2020-07-04 17:41  liyexin  阅读(177)  评论(0编辑  收藏  举报