B. Catch Overflow!(手工栈模拟)

传送门

\(用栈的话很简单\)

\(因为是一层一层for套下去的,所以一旦出现for循环我们就让q[++top]=循环次数\)

\(那么q数组表示循环次数,p数组表示当前循环的贡献\)

\(每当出现end操作时,当前循环的贡献就要给上一次循环\)

\(也就是p[top-1]+=p[top]*q[top],再top--\)

\(当top为0时,p[0]就可以给答案加上去了\)

\(值得一提的是,每次都要检查p[top]的值是否太大\)

\(太大就不继续了,因为这样连long long都会爆掉,应该直接输出overflow\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10;
const ll inf=pow(2,32)-1;
ll n;
string s;
ll q[maxn],top,p[maxn];
ll zhuan(string s)
{
    ll ans=0;
    for(int i=4;i<s.length();i++)
        ans=ans*10+(s[i]-'0');
    return ans;
}
void over(int k){
    for(int i=k+1;i<=n;i++)  getline(cin,s);
    cout<<"OVERFLOW!!!";exit(0);
}
int main()
{
    cin>>n;
    getchar();
    ll ans=0,temp=0;
    for(int i=1;i<=n;i++)
    {
        getline(cin,s);
        if(s[0]=='f')
            q[++top]=zhuan(s);
        else if(s[0]=='e')
        {
            p[top-1]+=p[top]*q[top];
            p[top--]=0;
            if(top==0)  ans+=p[top],p[top]=0;
        }
        else
        {
            if(top) p[top]++;
            else    ans++;
        }
        if(ans>inf||p[top]>inf)   over(i);
    }
    cout<<ans;
}

原文链接: https://www.cnblogs.com/iss-ue/p/12970476.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    B. Catch Overflow!(手工栈模拟)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/351222

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午6:45
下一篇 2023年3月2日 上午6:45

相关推荐