Codeforces Round #375 (Div. 2) C - Polycarp at the Radio 思路+貪心
阿新 • • 發佈:2018-11-13
本場詳細題解見:https://blog.csdn.net/xiang_6/article/details/83549528
題意&思路見上述連結
#include<bits/stdc++.h> using namespace std; #define out fflush(stdout) #define fast ios::sync_with_stdio(0),cin.tie(0); #define FI first #define SE second typedef long long ll; typedef pair<int,int> P; const int maxn = 2000 + 7; const int INF = 0x3f3f3f3f; int n, m; int a[maxn]; map<int,int> mp; queue<P> qu; int main() { scanf("%d%d", &n, &m); int t_ = n / m; for(int i = 1; i <= n; ++i) { scanf("%d", &a[i]); mp[a[i]]++; } for(int i = 1; i <= m; ++i) { int t = mp[i]; if(t < t_) { qu.push(P(i, t_-t)); } } int ans = 0; while(!qu.empty()) { P t = qu.front(); qu.pop(); bool ok = 0; for(int i = 1; i <= n; ++i) { if(a[i] > m) { a[i] = t.FI; if(t.SE > 1) { qu.push(P(t.FI, t.SE-1)); } ok = 1; ans++; break; } } if(ok) continue; for(int i = 1; i <= n; ++i) { if(mp[a[i]] > t_) { mp[a[i]]--; a[i] = t.FI; if(t.SE > 1) { qu.push(P(t.FI, t.SE-1)); } ans++; break; } } } // for(int i = 1; i <= n; ++i) { // if(a[i] > m) { // a[i] = 1; // ans++; // } // } printf("%d %d\n", t_, ans); for(int i = 1; i <= n; ++i) { printf("%d%c", a[i], (i == n ? '\n' : ' ')); } return 0; }