紫書 習題8 3 UVa 12545 (構造法)

2021-08-19 15:47:06 字數 2210 閱讀 2228

參考了

最後推出來操作的個數為問號的個數 加上 同一位置上s串為0而t串為1的位置數量 

與 同一位置上s串為1而t串為0的位置數量的最大值。

也就是max(ans1 + ans2) + que (que為問號總數, 而ans1和ans2意義如上)

這個公式應該是眾多部落格裡面最簡單的了, 讓我一步一步推給你看

首先判斷可不可行, 如果s串1大於t串中1的個數那麼就永遠不行

因為s串中1的個數只能增加(0變成1或者問號變成1), 不能減少。

所以導致了s串中1的個數永遠大於t串中1的個數, 自然不管怎麼變永遠不能相等

然後考慮怎麼變

首先問號變成數字最多可以消去1個差異, 0變成1也是最多消去1個差異, 而交換可以消除兩個差異

所以盡量交換, 能交換就交換。

所以第一步就是先盡量交換, 問號先不理它。

交換的運算元怎麼求?

交換的時候把0和1交換位置使得相同, 也就是說要「配對」, 也就是一對同一位置上s串是0而t

串是1和同一位置上s串是1而t串是0的兩個位置, 這個時候可以交換, 然後位置就匹配上了。

所以我們就要找這樣子有幾對。

顯然, 我們可以求出同一位置上s串是0而t串的位置數ans1, 和同一位置上s串是1而t串為0的位置數

ans2, 那麼既然要「配對」, 那麼對數就是兩者的最小值,多餘的後面再處理。

也就是對數 = min(ans1 + ans2)

好了, 交換完了之後,差異有兩個, 乙個是問號, 乙個是交換下來多出的位置。

問號的運算元到最後會加上。

多出的位置要不全是s串為0, t串為1, 要不全是s串為1, t串為0 要不剛好匹配完。

(1)剛好匹配完(ans1 = ans2), 那就把問號全部變成與t串該位置的數字一樣就可以了。

那麼此時ans1 = ans2, 也就是配對消耗的操作 = min(ans1 + ans2) = ans1(或ans2, 無所謂)

所以總算子= 配對消耗的操作+問號變化的操作 = ans1 + que(que為問號數)

顯然開頭那個式子是可以使用這種情況的, 也就是max(ans1 + ans2) + que = ans1 + que

(2)如果匹配完多餘的是同一位置上s串為0t串為1(ans1 >ans2)。

那麼顯然, 把0變成1, 而問號變成t串上該位置的數字

那麼額外的運算元就是0變成1, 也就是配對完多餘的數目, 也就是ans1 - ans2

所以總算子 = 配對消耗的操作+問號變化的操作 + 0變成1的運算元

=min(ans1, ans2) + ans1 - ans2 + que

= ans2 + ans1 - ans2 + que

= ans1 + que

這裡的ans1是ans1和ans2中的最大值。

所以符合開頭講的式子

(3)如果匹配完多餘的是同一位置上s串為1t串為0(ans1 < ans2)。

那麼這個時候就只有替換一種可能了(因為只能0變成1不能1變成0)

那麼替換**的呢, 前面替換好了不動, 那麼就替換問號, 問號中

同一位置是1的, 把問號變成0, 然後0和上面說的1替換, 就匹配成功了

所以這個時候的運算元就是多餘的個數, 也就是(ans2 - ans1)。

所以總算子 = ans1 + ans2 - ans1 + que = ans2 +que

ans2依然是ans1和ans2中的最大值, 同理就可以得出開頭那個式子。

呼~終於寫完了, 真的是大道至簡, 推到最後的式子非常的簡單。

#include#include#include#define rep(i, a, b) for(int i = (a); i < (b); i++)

using namespace std;

const int maxn = 112;

char s[maxn], t[maxn];

int main()

if(s1 > t1) printf("case %d: -1\n", ++kase);

else printf("case %d: %d\n", ++kase, que + max(ans1, ans2)); }

return 0;

}

紫書 習題 9 8 uva1632

題意 有n個寶藏,每個都在乙個位置p i 在規定的時間t i 就會消失。阿里巴巴要在寶藏消失前收集齊所有寶藏,問 有方法嗎?有的話最少多少秒?思路 開始想的是用狀態轉移方程來乙個個判斷,不好寫。看了題解知道在一段區間 l,r 要使時間最短必須從端點出來,然後果斷寫了乙個記憶化搜尋,tle了。再看題解...

紫書 習題 9 8 uva 10163

解題感想 好久沒刷題了,自己連揹包dp都差不多忘了。題目看著很複雜,可以將問題分解來看,和高中數學題的感覺一樣 1.求任意一組組合的最小的保護值 的最大值 2.求在改最大組合的情況下的,求最小的工資和,和某圖論一樣的思路。解題思路 第乙個揹包 任意組合 抽象成模板 在n個應聘者中選x人使得看守m個倉...

紫書 習題8 12 UVa 1153(貪心)

本來以為這道題是考不相交區間,結果還專門複習了一遍前面寫的,然後發現這道題的區間是不是 固定的,是在乙個範圍內 滑動的 只要右端點不超過截止時間就ok。然後我就先考慮有包含關係的時候怎麼選,然後發現當兩個區間只能放乙個的時候時間更短而截 至時間更長的時候,顯然更優。然後我就試著每個區間放的時候後後面...