这题可以把操作理解成“拿一个数当扩音器,把它的值广播给别人然后自己消失”。
最优策略很直观:只要当前最小数是负的,就让它给所有剩余数都加一次(这样降得最快);一旦最小数已经不负了,继续操作只会让结果变大,所以直接把剩下的数一路合并,答案就是当前总和。
void solve(){
int n;cin>>n;
vll a(n+1),suf(n+2);
for(int i=1;i<=n;++i)cin>>a[i];
sort(a.begin()+1,a.end());
for(int i=n;i>=1;--i)suf[i]=suf[i+1]+a[i];
ll ad=0;
for(int i=1;i<=n;++i){
ll x=a[i]+ad;
if(x<0&&i<n){
ad+=x;
}else{
ll ans=suf[i]+ad*(n-i+1);
cout<<ans<<endl;
return;
}
}
}

京公网安备 11010502036488号