题意:给你一个n,m;其中n一定能被m整除,然后给你n个数

有一种操作   选择n个数中的任意一个,使其+1;

条件:

  Ci 属于[0,m-1]  Ci代表ai模m的余数为i的个数 且都等于n/m;

  (

    比如n=4,m=2;n/m=2;

    a1=0,a2=1,a3=2,a4=3;

    Ci属于[0,1];

    a1%m=0;a2%m=1;a3%m=0;a4%m=1;

    所以C1=C2=n/m=2;

  )

求:最少需要操作几次才能满足以上要求

 

代码如下:

 

 1 #include <iostream>
 2 #include <cstdio> 
 3 #include <set> 
 4 #include <algorithm> 
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=2e5+5;
 8 ll cnt[maxn],a[maxn],val,res,ans;
 9 set<ll> s;
10 set<ll> ::iterator it;
11 int main()
12 {
13     int n,m;
14     cin>>n>>m;
15     for(int i=0;i<m;cnt[i++]=n/m)
16         s.insert(i);
17     for(int i=1;i<=n;i++)
18     {
19         cin>>a[i];
20         val=a[i]%m;
21         if(val>(*s.rbegin()))res=*s.begin();
22         else res=*s.lower_bound(val);
23         if(!--cnt[res])s.erase(res);
24         ans=ans+(res-val+m)%m;
25         a[i]=a[i]+(res-val+m)%m;
26     }
27     cout<<ans<<endl;
28     for(int i=1;i<=n;i++)
29         cout<<a[i]<<" ";
30     cout<<endl;
31     return 0;
32 }