【题解】AT_agc011_b [AGC011B] Colorful Creatures

原题传送门


我们知道,要想使一个生物能活到最后,那么它进行的每一次吸收前,它的大小应当尽可能大,所以我们考虑贪心,对生物的大小从小到大排序,每个生物都从小的开始吸收,看能不能活到最后,时间复杂度 O(n2)

我们还知道,排序后,生物 i 能活到最后,则生物 i+1n 一定也能活到最后;生物 i 不能活到最后,则生物 1i1 一定也不能活到最后。所以我们可以在排序后从后往前扫描 ai,用前缀和求得 ai 当前最大的大小(即吸收前面所有比它小的),判断能否吸收生物 i+1,吸收不了则它就或不到最后,比它小的生物也或不到最后,所以终止扫描。时间复杂度降为 O(n)

1|0code

/*Written by smx*/ #include<bits/stdc++.h> using namespace std; #define int long long #define QAQ cout<<"QAQ\n"; const int MAXN=1e5+5,inf=1e18,mod=1e9+7; int n,ans=1; int a[MAXN],sum[MAXN]; signed main(){ //freopen(".in","r",stdin); //freopen(".out","w",stdout); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+a[i]; } for(int i=n-1;i>=1;i--){ if(sum[i]*2>=a[i+1]){ ans++; }else{ break; } } cout<<ans; return 0; }

__EOF__

本文作者shimingxin1007
本文链接https://www.cnblogs.com/shimingxin1007/p/18561463.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   shimingxin1007  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示