题目描述:
主要思路:
先二分答案 找出前几轮整 最后再跑剩下的几个 注意一下特殊情况(打不完k次就没人吃饭了,刚好)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N];
ll n,k;
deque<ll> q;
bool find(ll x)
{
ll sum=0;
for(ll i=1;i<=n;i++)
{
sum+=min(x,a[i]);
}
return (sum>k);
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
ll l=0,r=1e9;
while(l<r)
{
ll mid=(l+r+1ll)>>1;
if(find(mid)) r=mid-1;
else l=mid;
}
ll sum=0;
for(ll i=1;i<=n;i++)
{
sum+=min(l,a[i]);
if(a[i]>l)
{
a[i]-=l;
q.push_back(i);
}
}
sum=k-sum;
while(sum&&q.size())
{
sum-=1;
ll now=q.front();
q.pop_front();
a[now]-=1;
if(a[now]) q.push_back(now);
}
if(q.size()||sum==0)
{
for(auto x:q)
{
cout<<x<<' ';
}
}
else cout<<-1<<endl;
return 0;
}