#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define debug(x) cerr << #x << " = " << x << endl
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define per(i, a, b) for (int i = (a); i >= (b); i--)
#define gn(u, v) for (int v : G.G[u])
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
#define pii pair<int, int>
#define vi vector<int>
#define vpii vector<pii>
#define vvi vector<vi>
#define no cout << "NO" << endl
#define yes cout << "YES" << endl
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define tomin(x, y) ((x) = min((x), (y)))
#define tomax(x, y) ((x) = max((x), (y)))
#define pq priority_queue
constexpr int MAXN = 2e5+5;
int n, m, k;
pii a[MAXN];
int res[MAXN];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k;
// if (n == m) {
// for (int i = 1; i <= n; i++)
// cout << "0" << " ";
// cout << endl;
// return 0;
// }
for (int i = 1; i <= n; i++)
cin >> a[i].first, a[i].second = i, k -= a[i].first;
sort(a + 1, a + n + 1);
int cnt = 0;
for (int i = n - m + 1; i <= n; i++) {
if (a[i].first == a[n - m + 1].first) cnt++;
}
for (int i = 1; i <= n - m; i++) {
int t = k, ans = 0;
t -= a[n - m + 1].first - a[i].first;
if (t < 0) {
res[a[i].second] = -1;
continue;
}
ans += a[n - m + 1].first - a[i].first;
ans += (t + cnt) / (cnt + 1);
res[a[i].second] = ans;
}
int sum = 0;
for (int i = n - m + 1; i <= n; i++) {
sum += (a[i].first - a[i - 1].first) * (i - (n - m));
int t = k, ans = 0;
t -= sum;
if (t < 0) continue;
int tmp = i - (n - m);
ans += (t + tmp) / (tmp + 1);
// cerr << tmp << endl;
res[a[i].second] = ans;
}
for (int i = 1; i <= n; i++)
cout << res[i] << " ";
cout << endl;
return 0;
大概思路就是贪心计算每个人前面要多少个人才能把他踢掉。
AC了6个点,WA41个点,过样例