考虑先取 c 最小且最后的位置 p,再在 [p+1,n] 看有没有能使得总次数不变的,可以就贪心的改掉,为啥 WA 3 了啊。
#include<bits/stdc++.h>
#define int long long
#define N 500005
using namespace std;
const int inf=1e9;
int n,k;
int c[N],tag[N];
int f[N];
void sol(){
cin>>n;
for(int i=1;i<=n;i++) cin>>c[i],tag[i]=0;
cin>>k;
int id=0;
c[0]=inf;
for(int i=1;i<=n;i++)
if(c[i]<=c[id])
id=i;
tag[id]+=(k/c[id]);
k=k-tag[id]*c[id];
for(int i=n;i>id;i--){
int cst=c[i]-c[id];
int tim=min(k/cst,tag[id]);
k=k-(tim*cst);
tag[id]-=tim;
tag[i]+=tim;
}
tag[n+1]=0;
for(int i=n;i>=1;i--) tag[i]+=tag[i+1],f[i]=tag[i];
for(int i=1;i<=n;i++) cout<<f[i]<<' ';
cout<<endl;
}
signed main(){
cin.tie(0); ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--) sol();
return 0;
}