財神娛樂首存即享優惠回饋唷~詳情請進👉

Codeforces 999D Equalize the Remainders 吃角子老虎機 機率【數據布局】【貪心】

科場的時辰想到的n*m做法tle了,正解是O(n+m)

起首想到一共性質是不論a[i],a[j]相差若干,只需a[i],a[j]同余,那想讓他們increase后%m失去另一個余數,那他們必要increse的次數是相等的。

以是咱們想到把n個數按%m從0到m-1分紅m類。如許就能貪心了,由于若是%m為0如許的數大于n/m個,那如許申明這內里的v.size()-n/m個數最少要加1,咱們把這些多進去的%m為0的數轉化成%m為1的數;若是小于n/m先不處置。一遍掃完咱們發明m-1這一項會有許多數(由于后面的都壓過來了),m-1之前size最大為n/m。

然后咱們再掃一遍把過剩的余m-1的數轉移到之前不滿n/m的就可以了。但如許龐大度是O(n*m),由于可能一最先余0內里有n個數,如許的話每個數都要賡續的+1放到下一個余數里,再+1放到下一個余數里以此類推。

正解是把多進去的那些數放到一個鳴fre的vector里(free是樞紐字以是不克不及用)【與此相對于的是我把它放到下一個余數的vector中】,台灣六合彩玩法如許就巧妙地幸免了我之前碰到的成績(不會反復加以及刪除)。這里說一下vector里要領的龐大度:push_back()以及pop_back()是O(1);insert以及erase是O(n)【我曩昔覺得都是常數。。】

?

 1 539怎麼玩才會贏#include<iostream>
 2 #include<vector>
 3 #include<map>
 4 using namespace std;
 5 
炫海娛樂城 6 vector<int> remain[200005];
 7 vector< pair<int,int> > fre; //first是index,second是余數 
 8 long long a[200005],pl[200005],ans;
 9 
10 int main(){    
11     int n,m; cin>>n>>m;
12     for(int i=1;i<=n;i++){
13         cin>>a[i];
14         remain[ a[i]%m ].push_back(i);
15     }
16      
17     for(int i=0;i<m;i++){//遍歷每一個remainder
18         if( remain[i].size()>n/m ){
19             int tran = remain[i].size()-n/m;
20             while(tq8娛樂城ran--){
21                 fre.push_back( make_pair(remain[i].back(),i) );
22                 remain[i].pop_back();
23             }
24         }
25         else if( remain[i].size()<n/m ){
26             int need = n/m - remain[i].size();
27             //free內里的余數一定比目前的小
28             while( (!fre.empty() ) && need-- ){
29                 pl[ fre.back().first ]+= i - fre.back().second;
30                 ans+=i - fre.back().second;
31                 remain[i].push_back( fre.back().first  );
32                 fre.pop_back();
33             } 
34         }
35     六合彩結果號碼}
36     
37     for(int i=0;i<m;i++){
38         if( remain[i].size()<n/m){
39             int need=n/m-remain[i].size();
40             //free內里的余數一定比目前的大 
41             while( need-- ){
42                 pl[ fre.back().first ]+= (m-fre.back().second) + i;
43                 ans+=(m-fre.back().second) + i;
44                 remain[i].push_back( fre.back().first  );
45                 fre.pop_back();
46             }     
47         }
48     }
49     
50     cout<<ans<<endl;
51     for(int i=1;i<=n;i++) cout<<a[i]+pl[i]<<"大眾 "大眾;
52     
53     return 0;
54 }

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。