2011 普及組 T4 表示式的值

2021-08-09 08:46:10 字數 1851 閱讀 3177

題目描述

對於1 位二進位制變數定義兩種運算:

先計算括號內的,再計算括號外的。

「× 」運算優先於「⊕」運算,即計算表示式時,先計算× 運算,再計算⊕運算。例如:計算表示式a⊕b × c時,先計算 b × c,其結果再與 a 做⊕運算。

現給定乙個未完成的表示式,例如+(_*),請你在橫線處填入數字0 或者1 ,請問有多少種填法可以使得表示式的值為0 。

輸入輸出格式

輸入格式:

輸入檔名為exp.in ,共 2 行。

第1 行為乙個整數 l,表示給定的表示式中除去橫線外的運算子和括號的個數。

第2 行為乙個字串包含 l 個字元,其中只包含』(』、』)』、』+』、』』這4 種字元,其中』(』、』)』是左右括號,』+』、』』分別表示前面定義的運算子「⊕」和「×」。這行字元按順序給出了給定表示式中除去變數外的運算子和括號。

輸出格式:

輸出檔案exp.out 共1 行。包含乙個整數,即所有的方案數。注意:這個數可能會很大,請輸出方案數對10007 取模後的結果。

輸入輸出樣例

輸入樣例#1:

4 +(*)

輸出樣例#1:

3 說明

【輸入輸出樣例說明】

給定的表示式包括橫線字元之後為:+(_*)

在橫線位置填入(0 、0 、0) 、(0 、1 、0) 、(0 、0 、1) 時,表示式的值均為0 ,所以共有3種填法。

【資料範圍】

對於20% 的資料有 0 ≤ l ≤ 10。

對於50% 的資料有 0 ≤ l ≤ 1,000。

對於70% 的資料有 0 ≤ l ≤ 10,000 。

對於100%的資料有 0 ≤ l ≤ 100,000。

對於50% 的資料輸入表示式中不含括號。

什麼洛谷上的標籤是動態規劃,其實就是個棧+模擬。

但是棧zhan0, zhan1中儲存的是湊成形成0或1的方法數。與等價表示式不同的是需要自己判斷什麼時候插入數字。

碼力很弱的蒟蒻調了一上午才a的**

#include

#include

using namespace std;

const int

mod=10007;

int n,zhan0[50000],zhan1[50000],top0,top1,topop=0;

char ch[100000],op[50000];

inline int read()

while (ch>='0'&&ch<='9')

return now*f;

}void write(int x)

if (x>=10) write(x/10);

putchar(x%10+'0');

}int level(char ch)

}void calc(char ch)

case

'*':

}}void push_num()//加入數字1

int main()

else

if (ch[i]=='(') //括號左邊放乙個,右邊放乙個

else

if (ch[i]==')')

else

if (level(op[topop])>=level(ch[i]))//忘記了level,一定要細心!

else

if (level(op[topop])if (ch[i+1]!='(') push_num();

}i++;

}write(zhan0[1]%mod);

return

0;}

---by迫切的想要提高碼力的李嘉狗

NOIP2011普及組T4 表示式的值 模擬 棧

做法 一般求表示式值的問題都用棧來解決,而這一題棧中的每乙個元素要存兩個數,可以用pair來儲存,first表示一段中結果為0的情況數,second表示一段中結果為1的情況數。設定乙個函式f l,r 表示 l,r 這一段所得的結果情況數 返回值形式為上述的pair 不難想到處理方法 如果l r,返回...

2006NOIP普及組 T4 數列

p1062 數列 題目傳送門 方法一 看一下樣例 3 100 1,3,4,9,10,12,13 該序列實際上就是 3 0 3 1 3 0 3 1 3 2 3 0 3 2 3 1 3 2 3 0 3 1 3 2 只看次冪 0,1,1 0,2,2 0,2 1,2 1 0 再看看1 n的二進位制 舉個例子...

表示式的值(NOIP2011 普及組第四題)

對於 1 位二進位制變數定義兩種運算 運算的優先順序是 1.先計算括號內的,再計算括號外的。2.運算優先於 運算,即計算表示式時,先計算 運算,再計算 運算。例如 計算表示式a b c 時,先計算b c,其結果再與a 做 運算。現給定乙個未完成的表示式,例如 請你在橫線處填入數字0 或者1,請問 有...