1.題目大意:
在布林邏輯中,析取正規化(dnf)是邏輯公式的標準化(或規範化),它是合取子句的析取。乙個邏輯公式被認為是 dnf 的,當且僅當它是乙個或多個文字的乙個或多個合取的析取。同合取正規化(cnf)一樣,在 dnf 中的命題運算元是與、或和非。非運算元只能用做文字的一部分,這意味著它只能領先於命題變數。
簡單來說,析取正規化是一些字句的邏輯或,而它的字句是乙個合取正規化;合取正規化是一些字句的邏輯或,而它的字句是乙個析取正規化。
本題中,邏輯樹最深的節點是乙個邏輯與,然後邏輯的與和或在每層交替出現。從最下層為一數起,奇數層是邏輯與,偶數層是邏輯或。
假設a=false, b=true, c=false, d=true, e=false那麼這顆bool樹的最終結果為false
上圖輸入資料形式為:((f(tf))(tf))
題解:既然是一顆樹,那麼很自然的會想到要建一棵樹,可是資料給的很噁心,要想建好一棵樹然後再來求解貌似不太好實現(不信你可以試試,反正我的失敗了)。
後來靈光一閃,讓我看出了端倪,樹不是一層一層的嗎,深搜不也是一層一層的嗎,我每次遇到乙個『(』號,就進行一次深搜,遇到『)』便結束搜尋。遇到t或者f便先儲存,最後根據該次搜尋的深度來決定是用或操作還是用與操作。
寫好提交,果斷ac,爽歪歪啊
view code
#include<
iostream
>
#include
<
string
>
using
namespace
std;
char
str[
32005
];int
len;
intvisit[
32005
];int
dfs(
ints,
intdep)
}else
if(str[i]=='
t'||str[i]=='
f') //
本身深度,直接儲存結果
}else
if(str[i]=='
)') //
該深度計算結束}}
ans=
num[0];
if(dep%2
==0) //
偶數層用與操作
}else
//奇數層用或操作
}return
ans;
}int
main()
else
if(str[i]=='
)')dd
--;}if
(maxdd%2
==0) //
由於題目要求最後一層深度要用與操作,而我的想法是深蒐時偶數層相與奇數層相或,所以必須人工判別
else
}else
else}}
return0;
}
BOOL和bool的區別
bool和bool的區別 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別而bool是標準c...
BOOL和bool的區別
一 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別 二 bool是標準c 資料型別,可取值...
BOOL和bool的區別
一 1 型別不同 bool為int型 bool為布林型 2 長度不同 bool只有乙個位元組 bool長度視實際環境來定,一般可認為是4個位元組 3 取值不同 bool取值false和true,是0和1的區別 bool取值false和true,是0和非0的區別 二 bool是標準c 資料型別,可取值...