用 map 存 a[i] 出现的次数,map默认从小到大排序
如果当前 k 可以使得 饭量为 a[i] 的这些同学吃饱,那么把这些同学从队伍中删去,维护队伍长度变化。
否则,每打完一次饭,当前同学剩余饭量最少为0。,维护当前队列即可。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int,int>
const int N = 1e5 + 10, inf = 0x3f3f3f3f;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
ll k, sum = 0;
cin >> n >> k;
map<ll,int> mp;
for(int i = 0; i < n; i++) {
cin >> a[i];
sum += a[i];
mp[a[i]]++;
}
if(sum < k) {
cout << -1;
return 0;
}
ll len = n, ma = 0, algo = 0;
for(auto x : mp) {
if( k < (x.first - algo) * len) {
break;
}
k -= (x.first - algo) * len; // 之前删过了algo,只需再删 (x.first - algo)
ma = algo = x.first; // 删除队伍的最大饭量
len -= x.second;
}
if(len == 0) {
cout << " ";
return 0;
}
int res = k % len;
ll red = k / len + ma;
vector<PII> ans1;
vector<int> ans2;
for(int i = 0; i < n; i++) {
if(a[i] > ma) {
ans1.push_back({a[i],i}); // 剩余
}
}
for(int i = res; i < (int)ans1.size(); i++) {
if(ans1[i].first - red > 0) ans2.push_back(ans1[i].second+1);
}
for(int i = 0; i < res; i++) {
if(ans1[i].first - red - 1 > 0) ans2.push_back(ans1[i].second+1);
}
if(ans2.size()==0) {
cout << " ";
}
for(auto x : ans2) {
cout << x << " ";
}
return 0;
}