整个一个模拟
先不做处理计算等级为x的种子数量
然后模拟种植操作直到所有种子等级都小于x
时间复杂度O(n*log 1e9)
#include<iostream>
using namespace std;
int n;
int a[100010];
int s[100010];
int x;
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
s[i]=1;
}
cin>>x;
long long int ans=0;
for(int i=1;i<=n;++i){//初始等级为x的种子数量
if(a[i]==x){
ans+=s[i];
}
}
int t;//标记每轮种植后是否有大于x的种子
do{//模拟种植
t=0;
long long res=0;//记录本轮大于x种子数量
for(int i=1;i<=n;++i){
a[i]=(a[i]+2)/3;//向上取整模拟种植
s[i]*=2;//种子数*2
if(a[i]>x){
t=1;
}
if(a[i]==x){
res+=s[i];
}
}
ans=max(res,ans);
}while(t);
cout<<ans<<endl;
}