C | 耕种时间到
获得木头
https://ac.nowcoder.com/acm/contest/81126/A
由x倒推能生成x等级小麦
可以知道是在区间 [2x-2,2x] 可以生成x等级的小麦,递归下去可以发现一颗二叉树 range 记录每一层的范围
什么时候停止生成呢?
当小麦的最大值maxval小于生成的区间有边界range.second停止生成
我们从第第一层[x,x]开始
统计答案
由于题目必须要求全部种,全部不种,一次只能考虑种某一层的小麦,所以我们遍历每一层能生成的小麦取最大值
每一层能产生的小麦是多少呢?
暴力枚举每一个小麦,枚举所有层数看属于哪一层 。用cnt数组统计第i层有多少小麦 结果就是cnt[i] * 2^(i-1) 实现时用左移即可
虽然是双重循环由题目条件可知,层数不会超过20
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll cnt[100];
int a[N];
int n,x;
pair<ll,ll>range[100];
int main()
{
cin>>n;
int maxval=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
maxval=max(maxval,a[i]);
}
cin>>x;
ll len=1,l=x,r=x;
range[len].first=x;
range[len].second=x;
while(r<=maxval)
{
len++;
range[len].first=l*3-2;
range[len].second=r*3;
r=range[len].second;
l=range[len].first;
}
for(int i=0;i<n;i++)
{
for(int j=1;j<=len;j++)
{
if(a[i]>=range[j].first&&a[i]<=range[j].second)
{
cnt[j]++;
break;
}
}
}
ll ans=0;
for(int i=1;i<=len;i++)
{
int d=i-1;
ll cur=cnt[i] * (1 << d);
if(cur>ans) ans=cur;
}
cout<<ans<<endl;
return 0;
}