狀壓 軟體補丁問題

2022-05-05 16:15:10 字數 1908 閱讀 9741

不知道為什麼放在網路流24題裡面,我感覺是狀壓。

題面乙個軟體中有\(n\)個錯誤,共\(m\)個補丁程式。每乙個補丁程式都有其特定的適用環境。對於每乙個補丁\(i\)都有\(2\)個與之相應的錯誤集合\(b1[i]\)和,\(b2[i]\)使得僅當軟體包含\(b1[i]\)中的所有錯誤,而不包含\(b2[i]\)中的任何錯誤時,才可以使用補丁\(i\)。補丁\(i\)將修復軟體中的某些錯誤\(f1[i]\),而同時加入另一些錯誤\(f2[i]\)。每個補丁都耗費一定的時間。

試設計乙個演算法,利用\(m\)個補丁程式將原軟體修復成乙個沒有錯誤的軟體,並使修復後的軟體耗時最少。對於給定的\(n\)個錯誤和\(m\)個補丁程式,找到總耗時最少的軟體修復方案。

輸入格式

第 1 行有 2 個正整數\(n\)和\(m\),\(n\)表示錯誤總數,\(m\)表示補丁總數,\(1\leq n\leq20\), \(1\leq m\leq 100\)。

接下來\(m\)行給出了\(m\)個補丁的資訊。每行包括乙個正整數,表示執行補丁程式\(i\)所需時間,以及\(2\)個長度為\(n\)的字串,中間用乙個空格符隔開。

第\(1\)個字串中,如果第\(k\)個字元\(bk\)為「\(+\)」,則表示第\(k\)個錯誤屬於\(b1[i]\),若為「\(-\)」,則表示第\(k\)個錯誤屬於\(b21[i]\),若為「\(0\)」,則第\(k\)個錯誤既不屬於\(b1[i]\)也不屬於\(b2[i]\),即軟體中是否包含第\(k\)個錯誤並不影響補丁\(i\)的可用性。

第\(2\)個字串中,如果第\(k\)個字元\(bk\)為「\(-\)」,則表示第\(k\)個錯誤屬於\(f1[i]\),若為「\(+\)」,則表示第\(k\)個錯誤屬於\(f2[i]\),若為「\(0\)」,則第\(k\)個錯誤既不屬於\(f1[i]\)也不屬於\(f2[i]\),即軟體中是否包含第\(k\)個錯誤不會因使用補丁\(i\)而改變。

輸出格式

程式執行結束時,將總耗時數輸出。如果問題無解,則輸出\(0\)。

因為資料範圍很小,所以我一開始想到的是狀壓。

狀壓的狀態就是軟體錯誤的狀態。總共是\(2^\)種,開乙個陣列\(dis\)表示到達某種狀態的最短時間,那麼最後的答案就是\(dis[0]\)(我以"\(1\)"為「有錯誤」)

首先,讀入。

將\(b1\)和\(b2\)分開存。由題面可知,如果\(b1|x==x\),這說明\(x\)中包含\(b1\),若\(b2\)&\(x==0\),則說明\(b2\)和\(x\)沒有交集。這樣就可以判斷某個修補程式是否可用。

而\(f\)的讀入方法類似。兩個分開存。

int x = now ^ (now & f1[i]);

x |= f2[i];

\(now\)是當前狀態,\(x\)是使用修補程式後的狀態。這個式子應該不難推。

剩下的就是跑最短路了。相當於在狀態之間連邊,「距離」為最小時間。

#include #include #include #include #include using namespace std;

long long read()

int n, m, s, t[105], b1[105], b2[105], f1[105], f2[105], dis[1<<21];

bool vis[1<<21];

bool judge(int x, int u)

void spfa()

}vis[now] = 0;

}}string s;

int main()

spfa();

if(dis[0] == 0x3f3f3f3f) puts("0");//特判

else printf("%d", dis[0]);

return 0;

}

軟體補丁問題

題目鏈結 順著做網路流24題看到的 起初原本以為是費用流 後來看到 n 20 狀壓走起 這題狀壓還是很明顯的,b1,b2,f1,f2 都明顯壓縮,初始狀態 1 n 1 目標狀態 0 這題因為點數太多,直接建邊的話空間代價太大,我們選擇對每個點都跑乙個 m 次的列舉 當現在的狀態 now 滿足 now...

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

題目描述 description 錯誤就是人們所說的bug。使用者在使用軟體時總是希望其錯誤越少越好,最好是沒有錯誤的。但是推出乙個沒有錯誤的軟體幾乎不可能,所以很多軟體公司都在瘋狂地發放補丁 有時這種補丁甚至是收費的 t公司就是其中之一。上個月,t公司推出了乙個新的字處理軟體,隨後發放了一批補丁。...

狀壓 孤島營救問題

題目鏈結 題目描述 1944 年,特種兵麥克接到國防部的命令,要求立即趕赴太平洋上的乙個孤島,營救被敵軍俘虜的大兵瑞恩。瑞恩被關押在乙個迷宮裡,迷宮地形複雜,但幸好麥克得到了迷宮的地形圖。迷宮的外形是乙個長方形,其南北方向被劃分為 n 行,東西方向被劃分為 m 列,於是整個迷宮被劃分為 n time...