题解 | #显生之宙#

显生之宙

https://www.nowcoder.com/practice/c2335f2530974af3a4ec15db2851f532

这题可以把操作理解成“拿一个数当扩音器,把它的值广播给别人然后自己消失”。
最优策略很直观:只要当前最小数是负的,就让它给所有剩余数都加一次(这样降得最快);一旦最小数已经不负了,继续操作只会让结果变大,所以直接把剩下的数一路合并,答案就是当前总和。

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;
        }
    }
}
全部评论

相关推荐

愤怒的查理被升职:每个项目经历后面加关键成果:xxx, 项目经历要和岗位JD匹配,不是有多少项目经历都要写上的,挑选出是个岗位JD的,并且内容往岗位JD方面写,教育背景直接写 大学+专业+时间,一行就过去了。你是建筑投运营别人不看你本科建筑学的怎么样
点赞 评论 收藏
分享
明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务