B. Catch Overflow!(模拟)

B. Catch Overflow!

 

思路一:

一开始想用堆栈,结果就一直卡在第7个点上,后来发现可以用递归做。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1e5+10;
typedef long long LL;
LL MX = 1,tim;
void Init(){
	for(int i=1;i<=32;i++) MX *= 2;
	MX--;
}
LL fun(){
	LL sum = 0;
	while(tim--){
		char ss[7];
		scanf("%s",ss);
		if(ss[0]=='a'){
			sum++;
			if(sum>MX) return -1;
		}
		else if(ss[0]=='f'){
			LL x;scanf("%lld",&x);
			LL tp = fun();
			if(tp==-1) return -1;
			sum += tp*x;
			if(sum>MX) return -1;
		}
		else if(ss[0]=='e'){
			return sum;
		}
	}
	return sum;
}
int main(void){
	Init(); 
	scanf("%lld",&tim);
	LL ans = fun();
	if(ans==-1) printf("OVERFLOW!!!\n");
	else printf("%lld\n",ans);
	return 0;
}

 

思路二:

看了别人的代码发现可以不递归,

简单的说就是先把for循环一层一层的存在一个堆栈里,

每次遇到add再取栈顶元素访问,(与我一开始的思路不同,这里是add时修改ans,而不是之前我想的en再取修改。)

遇到en就出栈。

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2e5+10;
typedef long long LL;
LL st[maxn],MX = 1;
void Init(){
	for(int i=1;i<=32;i++) MX *= 2;
	MX--;
}
int main(void){
	Init();
	st[0] = 1;
	int t1 = 0,fg = 0;
	LL ans = 0;
	int T;scanf("%d",&T);
	while(T--){
		char ss[7];
		scanf("%s",ss);
		if(ss[0]=='a'){
			if(fg) continue;
			if(ans>MX) fg = 1;
			else if(ans+st[t1]>MX) fg = 1;
			else ans += st[t1];
		}
		else if(ss[0]=='f'){
			LL x;scanf("%lld",&x);
			st[t1+1] = st[t1]*x;
			if(st[t1+1]>MX) st[t1+1] = MX+1; //注意防止数字过大越界。
			t1++;
		}
		else if(ss[0]=='e'){
			t1--;
		}
		if(ans>MX) fg = 1; 
	}
	if(fg) printf("OVERFLOW!!!\n");
	else printf("%lld\n",ans);
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值