空腹の食べ物-質問-DaimayuanOnlineJudgerre
解決策:古典派の二分法「calc関数は書くのが良い」
ACコード:
#include <iostream>
#define int long long
using namespace std;
const int N = 1e5+10;
int arr[N],ans[N];
int n,k;
int calc(int x)
{
int res=0;
for(int i=1;i<=n;i++)
{
if(arr[i]<x) res+=arr[i];
else res+=x;
}
return res;
}
signed main() {
int sum=0;cin>>n>>k;
for(int i=1;i<=n;i++)
scanf("%lld",&arr[i]),sum+=arr[i];
if(sum<k) {
printf("-1");
return 0;
}
int l=0,r=1e9;
while(l+1<r){
int mid = ( l + r ) / 2;
if(calc(mid)<=k) l=mid;
else r = mid;
}
k -= calc(l);
int tot=0;
for(int i=1;i<=n;i++){
if(arr[i]>l)
ans[++tot]=i;
}
for(int i=k+1;i<=tot;i++)
printf("%lld ",ans[i]);
for(int i=1;i<=k;i++)
if(arr[ans[i]]!=l+1) printf("%lld ",ans[i]);
return 0;
}