BZOJ1021 SHOI2008 迴圈的債務

2022-05-16 03:08:42 字數 2140 閱讀 8757

alice、bob和cynthia總是為他們之間混亂的債務而煩惱,終於有一天,他們決定坐下來一起解決這個問題。

不過,鑑別鈔票的真偽是一件很麻煩的事情,於是他們決定要在清還債務的時候盡可能少的交換現金。比如說,al

ice欠bob 10元,而cynthia和他倆互不相欠。現在假設alice只有一張50元,bob有3張10元和10張1元,cynthia有3

張20元。一種比較直接的做法是:alice將50元交給bob,而bob將他身上的錢找給alice,這樣一共就會有14張鈔票

被交換。但這不是最好的做法,最好的做法是:alice把50塊給cynthia,cynthia再把兩張20給alice,另一張20給

bob,而bob把一張10塊給c,此時只有5張鈔票被交換過。沒過多久他們就發現這是乙個很棘手的問題,於是他們找

到了精通數學的你為他們解決這個難題。

輸入的第一行包括三個整數:x1、x2、x3(-1,000≤x1,x2,x3≤1,000),其中 x1代表alice欠bob的錢(如

果x1是負數,說明bob欠了alice的錢) x2代表bob欠cynthia的錢(如果x2是負數,說明cynthia欠了bob的錢) x3

代表cynthia欠alice的錢(如果x3是負數,說明alice欠了cynthia的錢)

接下來有三行

每行包括6個自然數:

a100,a50,a20,a10,a5,a1

b100,b50,b20,b10,b5,b1

c100,c50,c20,c10,c5,c1

a100表示alice擁有的100元鈔票張數,b50表示bob擁有的50元鈔票張數,以此類推。

另外,我們保證有a10+a5+a1≤30,b10+b5+b1≤30,c10+c5+c1≤30,而且三人總共擁有的鈔票面值總額不會

超過1,000。

如果債務可以還清,則輸出需要交換鈔票的最少張數;如果不能還清,則輸出「impossible」(注意單詞全部

小寫,輸出到檔案時不要加引號)。

輸入一

10 0 0

0 1 0 0 0 0

0 0 0 3 0 10

0 0 3 0 0 0

輸入二

-10 -10 -10

0 0 0 0 0 0

0 0 0 0 0 0

0 0 0 0 0 0

輸出一5

輸出二0

對於100%的資料,x1、x2、x3 ≤ |1,000|。

可以發現他們把錢還清等價於三個人最後持有的錢數為他們應該有的錢(即他們本來有的減他們欠別人的加別人欠他們的)。

設他們的目標錢數分別是$ta,tb,tc$,

令$f_$表示只使用第$k$種至第$5$種(種類為$0..5$)錢幣,且現在a持有$i$元,b持有$j$元(c持有$s-i-j$元,其中$s$是總錢數),在此條件下要使他們達到目標狀態最少需要交換多少錢幣。

邊界條件:

$$f_=\begin

0 & i = ta, j = tb\\

\infty & otherwise

\end$$

轉移時,由於a給b錢b再給c錢沒有必要(如果b給c的比a給b的多,轉化為a給c,b給c;否則,轉化為a給b,a給c),所以只有6種情況,即某兩個人都給另乙個人,或某乙個人給另外兩個人(其實還有某個人不參與交換或全都不交換,只需看做給了0個,也可以當成上述六種情況之一)。

從大到小轉移時由於好多狀態用不到(比如a本來有103元時$f_$用不到,因為只有整百地取),記憶化搜尋即可。

**中加了乙個剪枝:若某人把剩下的錢還完也還不清,直接返回inf。

加了這個剪枝後執行時間少了近一半。(bzoj上1312s->764s)

附**:

#include #include using std::min;

const int n = 1050;

const int inf = 100000000;

int f[6][n][n];

int a[6], b[6], c[6];

int sa[6], sb[6], sc[6], sum;

const int v[6] = ;

int ta, tb, tc;

int dfs(int k, int aa, int bb)

int main()

BZOJ 1021 迴圈的債務

給出三個人之間的欠錢關係和他們各自持有的錢幣種類和個數,求能不能各自把錢還清,如果不能輸出 impossible 如果能輸出最小的給錢張數。dp太神了!弱菜自帶遇dp必跪flag 總之就是dp。可以按錢幣種類劃分階段,那麼方程可以為dp i j k 表示用上了前i種錢幣,達到了讓第乙個人有j塊錢,第...

BZOJ 3566 SHOI2014 概率充電器

題目 題意 給定樹形結構的n個元件,每個元件有一定概率自己充電,還有一定概率通過某條邊給其他元件充電,求充電的元件期望個數。n 500000 題解 樹形結構肯定能想到樹形dp,全樹對某點產生的貢獻一般可以通過一到兩遍樹形dp計算得出,本題所求期望等於每個元件被充電的概率之和。設f i 表示i被充電的...

bzoj3566 SHOI2014 概率充電器

n個充電器連成一棵樹。第i個充電器有p i 的概率直接充電。每條導線有一定機率可以導電。可以導電的導線形成的聯通塊中只要存在直接充電的結點整個聯通塊的充電器均進入充電狀態。問期望進入充電狀態的充電器個數 顯然可知我們只需要得到f i 表示i進入充電狀態的概率 那麼a ns f i 我們把無根樹變有根...