463. 饿饿 饭饭

用 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值