思路:二分答案,医生从第1个看到第N个动物算作1轮,二分出看完K次动物至多要多少轮,然后余数余多少就从那只动物开始排头。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+30;
int n, a[maxn];
LL k, yu;
bool check(LL x)
{
LL sum = 0;
for(int i=0; i<n; ++i)
{
sum += min((LL)a[i], x);
if(sum > k) return false;
}
return true;
}
int main()
{
scanf("%d%I64d",&n,&k);
LL sum = 0;
for(int i=0; i<n; ++i) scanf("%d",&a[i]), sum += a[i];
if(k > sum) return 0*puts("-1");
LL l = 0, r = sum;
while(l <= r)
{
LL m = l+r>>1;
if(check(m)) l=m+1;
else r = m-1;
}
sum = 0;
for(int i=0; i<n; ++i)
sum += min((LL)a[i], r);
yu = k - sum;
int st = 0, flag = 1;
for(int i=0; i<n; ++i)
{
a[i] -= min((LL)a[i], r);
if(a[i])
{
if(yu == 0 && flag)
{
flag = 0;
st = i;
}
else if(yu > 0)
{
--yu;
--a[i];
}
}
}
for(int i=st; i<n; ++i)
if(a[i]) printf("%d ",i+1);
for(int i=0; i<st; ++i)
if(a[i]) printf("%d ",i+1);
puts("");
return 0;
}