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+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

codeforces 653B B. Bear and Compressing(dfs)