注意注意:题目描述有误
2026-07-21 17:12:43
发布于:北京
18阅读
0回复
0点赞
题目描述中:
等级为 L 的汉堡(L≥0)按如下方式定义:
等级 0 汉堡:只有 一层肉饼(记作 P)。
等级 L 汉堡(L≥1):自下而上依次为:面包 B、等级 L−1 汉堡、肉饼 P、等级 L−1 汉堡、面包 B。
据此描述:
等级0汉堡:P
等级1汉堡:BPPPB,前1层0个肉饼(测试样例2)
等级2汉堡:BBPPPBPBPPPB,前7层4个肉饼(测试样例1)
这样就理顺了。
样例解释中提示:等级 50 汉堡的层数已经大到无法用 32 位整数表示。
显然依靠存储等级N的汉堡样式再进行输出是一定会超出存储范围的。因此不能存储实际样式,只能使用数据关系推断。
等级 n (n≥1)汉堡:面包 B、等级 n−1 汉堡、肉饼 P、等级 n−1 汉堡、面包 B。
查找前x层的肉饼(字符P)数量。
如果x的数值小于等于等级n汉堡层数的一半,则可将问题转化为:等级 n−1 汉堡的前x-1层中肉饼的数量;否则,问题可转化为:等级 n−1 汉堡中肉饼的数量+等级n-1汉堡中前 x-2-(等级 n−1 汉堡的层数)。
显然需要先计算每个等级汉堡的层数。
代码如下:
#include<iostream>
using namespace std;
long long N, X,zong[50]={1};
long long f(long long n, long long x){
if(x==0) return 0;
if(n==1) return 1;
long long mid=(n-1)/2;
if(mid>=x) return f((n-3)/2, x-1);
return f((n-3)/2, mid-1)+1+f((n-3)/2, x-mid-1);
}
int main(){
cin>>N>>X;
for(int i=1; i<=N; ++i) zong[i]=2*zong[i-1]+3;
long long tmp=zong[N];
cout<<f(tmp, X);
return 0;
}
通过率:70%,没通过的原因是因为超时。分析:递归调用中存在重复计算,会导致超时,但X最大超过int范围,显然也无法用二维数组存储某个等级汉堡下前X层中肉饼数量。突然悟了,虽然无法存储所有情况,但存储某个等级汉堡中总肉饼数量还是可以实现的,应该也可以有效降低重复计算次数。
更新迭代代码如下:
#include<iostream>
using namespace std;
long long N, X, zong[50]={1}, rou[50]={1};
long long f2(long long n, long long x){
if(x==0) return 0;
if(n==1) return 1;
if(n==x){ //n和x相等,即求当前等级汉堡下总肉饼数量
//找到层数为n的汉堡的等级,并返回相应等级的总肉饼数量
for(int i=0; i<=N; i++){
if(zong[i]==n) return rou[i];
}
}
long long mid=(n-1)/2;
if(mid>=x) return f2((n-3)/2, x-1);
return f2((n-3)/2, mid-1)+1+f2((n-3)/2, x-mid-1);
}
int main(){
cin>>N>>X;
for(int i=1; i<=N; ++i){
zong[i]=2*zong[i-1]+3;
rou[i]=2*rou[i-1]+1;
}
long long tmp=zong[N];
cout<<f2(tmp, X);
return 0;
}
这里空空如也







有帮助,赞一个