#include<bits/stdc++.h>
using namespace std;
long long n,k,a[100010];
int check(long long mid){
long long sum=0;
for(int i=1;i<=n;i++){
sum+=min(mid,a[i]);
}return sum<=k;
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
long long l=0,r=k+1,mid;
while(l+1<r){
mid=(l+r)/2;
if(check(mid))l=mid;
else r=mid;
}long long sum=0;
for(int i=1;i<=n;i++){
sum+=min(l,a[i]);
a[i]=max(a[i]-l,1LL-1);
}int j=1;
for(int i=1;i<=k-sum;i++){
while(a[j]==0)j++;
a[j]--;
}for(int i=1;i<=n;i++)cout<<a[i]<<" ";
return 0;
}
2 个赞
64
2 个赞
我也不会
![]()
3 个赞

你这里a[j]减少了之后
j应该++吧
4 个赞
老师,我j++后就对了
2 个赞
只要a[j]>0就一直在减他?? 不符合题意
4 个赞