BuringStraw

BuringStraw

CF1175B 捕捉溢位!

題目#

給一個函數 f,f 在一開始會傳入 x 的初始值。f 有一些指令,指令分三種:

for n - 迴圈

end - 每個迴圈的終止符。每個配對的 for n 和 end 之間的程式碼都要被執行 n 次。保證每個 for n 指令都能與一個 end 指令配對。

add - 將 x 增加 1。

做完所有操作後 x 被當做返回值返回。

在中途的運算中,x 可能會大於 $2^{32}?1$,此時你要輸出 OVERFLOW!!!

現在請輸出 f (0) 的值。

思路#

表面上這道題要用堆疊,但我決定用陣列來做。
f[i]表示當前處於第i層迴圈,迴圈體內執行的次數,
f[i] = f[i - 1] * n
會溢出的點有迴圈層數過深時和加得過多時,但很深的迴圈裡不一定有加法語句,所以這裡立個 flag 來判。
感覺自己是不是搞得太複雜了。。。。。。

Code#

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstdlib>
using namespace std;

const long long over = ((long long)1 << 32) - 1;

int n, h;
long long x;
long long cnt = 0;
vector<long long> f;

int main (void) {
    f.push_back(1);
    scanf("%d", &n);
    char t[4];
    bool flag = 0;
    for (int i = 1; i <= n; ++i) {
        scanf("%s", t);
        if (t[0] == 'f') {
            ++cnt;
            f.resize(cnt + 1);
            scanf("%d", &h);
			if (over / h < f[cnt - 1]) {
				flag = 1;
			}
            f[cnt] = f[cnt - 1] * h;
        }
        else if (t[0] == 'a') {
            if (flag) {
                printf("OVERFLOW!!!\n");
                exit(0);
            }
            else {
                int tmp = x;
                x += f[cnt];
                if (x > over || x < tmp) {
                    printf("OVERFLOW!!!\n");
                    exit(0);
                }
            }
        }
        else {
        	flag = 0;
            --cnt;
        }
    }
    printf("%I64d\n", x);
    return 0;
}

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。