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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务