【题解】AT_agc011_b [AGC011B] Colorful Creatures

原题传送门


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

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

\(\texttt{code}\)

/*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;
}
posted @ 2024-11-21 20:25  SMall_X  阅读(22)  评论(0)    收藏  举报