我们知道,要想使一个生物能活到最后,那么它进行的每一次吸收前,它的大小应当尽可能大,所以我们考虑贪心,对生物的大小从小到大排序,每个生物都从小的开始吸收,看能不能活到最后,时间复杂度 \(\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;
}
标签:agc011,int,题解,AGC011B,生物,最后,排序,吸收
From: https://www.cnblogs.com/shimingxin1007/p/18561463