codevs 2218 補丁vs錯誤(狀壓搜尋)

2021-08-09 17:23:53 字數 1890 閱讀 5553

題目描述 description

錯誤就是人們所說的bug。使用者在使用軟體時總是希望其錯誤越少越好,最好是沒有錯誤的。但是推出乙個沒有錯誤的軟體幾乎不可能,所以很多軟體公司都在瘋狂地發放補丁(有時這種補丁甚至是收費的)。t公司就是其中之一。

上個月,t公司推出了乙個新的字處理軟體,隨後發放了一批補丁。最近t公司發現其發放的補丁有致命的問題,那就是乙個補丁在排除某些錯誤的同時,往往會加入另一些錯誤.

此字處理軟體中只可能出現n個特定的錯誤,這n個錯誤是由軟體本身決定的。t公司目前共發放了m個補丁,對於每乙個補丁, 都有特定的適用環境,某個補丁只有在當前軟體中包含某些錯誤而同時又不包含另一些錯誤時才可以使用,如果它被使用,它將修復某些錯誤而同時加入某些錯誤。另外,使用每個補丁都要耗一定的時間(即補丁程式的執行時間)。

更準確地說明:

設此字處理軟體中可能出現的n個錯誤為集合b=中的元素,t公司目前共發放了m個補丁:p1,p2,…,pm。對於每乙個補丁pi, 都有特定的適用環境,某個補丁只有在軟體中包含某些錯誤而同時又不包含另一些錯誤時才可以用,為了說明清楚,設錯誤集合:bi+、 bi-, 當軟體包含了bi+中的所有錯誤, 而沒有包含bi-中的任何錯誤時,補丁pi才可以被使用,否則不能使用,顯然 bi+、bi-交集為空。補丁pi將修復某些錯誤而同時加入某些錯誤,設錯誤集合fi-、fi+,使用過補丁pi之後,fi-中的任何錯誤都不會在軟體中出現,而軟體將包含fi+中的所有錯誤, 同樣fi-、fi+交集為空。另外,使用每個補丁都要耗一定的時間(即補丁程式的執行時間)。

現在t公司的問題很簡單,其字處理軟體的初始版本不幸地包含了集合b中的全部n個錯誤, 有沒有可能通過使用這些補丁(任意順序地使用,乙個補丁可使用多次), 使此字處理軟體成為乙個沒有錯誤的軟體。如果可能,希望找到總耗時最少的方案。

輸入描述 input description

輸入檔案第一行有兩個正整數n和m, n表示錯誤總數,m表示補丁總數。接下來m行給出了m個補丁的資訊。每行包括乙個正整數(表示此補丁程式pi的執行耗時)和兩個長度為n的字串,中間用乙個空格符隔開。

第乙個字串,如果第k個字元為』+』,則表示bk屬於bi+, 若為『-』,則表示bk屬於bi-, 若為『0』,則bk 既不屬於bi+也不屬於bi-,即軟體中是否包含bk不影響補丁pi是否可用。

第二個字串,如果第k個字元為』+』,則表示bk屬於fi+, 若為『-』,則表示bk屬於fi-, 若為『0』,則bk 既不屬於fi+也不屬於fi-,即軟體中是否包含bk不會因使用補丁pi而改變。

輸出描述 output description

輸出乙個整數,如果問題有解,輸出總耗時,否則輸出0。

樣例輸入 sample input

3 31 000 00-

1 00- 0-+

2 0– -++

樣例輸出 sample output

8資料範圍及提示 data size & hint

1<=n<=20, 1<=m<=100

題解:

#include

#include

#include

#include

using

namespace

std;

const

int maxn=200;

int t[maxn];

int dis[1

<<20];

bool vis[1

<<20];

int b1[200],b2[200];

int f1[200],f2[200];

queue

q;int n,m;

int ask(int u,int k)

void spfa(int s)}}

}}

}int main()

else

return

0;}

2 2 1 殘缺棋盤

殘缺棋盤 defective chessboard 是乙個有2k 2k 個方格的棋盤,其中恰有乙個方格殘缺。圖2 3給出k 2時各種可能的殘缺棋盤,其中殘缺的方格用陰影表示。注意當k 0時,僅存在一種可能的殘缺棋盤 如圖1 4 3 a所示 事實上,對於任意k,恰好存在22k 種不同的殘缺棋盤。殘缺棋...

2 21 大整數排序

題目描述 對n個長度最長可達到1000的數進行排序。輸入描述 輸入第一行為乙個整數n,1 n 100 接下來的n行每行有乙個數,數的長度範圍為1 len 1000。每個數都是乙個正數,並且保證不包含字首零。輸出描述 可能有多組測試資料,對於每組資料,將給出的n個數從小到大進行排序,輸出排序後的結果,...

USACO2 2 1 序言頁碼

這題還是挺有意思的 但是會發現,其實每一位的情況都是一樣的,只需要考慮個位的0,1,2,3,4,5,6,7,8,9的情況下,1,5,10的使用情況。然後在兩位數的時候,十位的情況其實和個位一樣,只不過類推到10 50 100的使用上而已。兩位數的個位,依然和個位數的個位情況完全一樣。所以這道題就成了...