UVA11400 分析推理 dp

2021-08-09 10:35:26 字數 1711 閱讀 5546

有n種燈泡,不同種類的燈泡需要同種電源,同種燈泡只需乙個電源。你現在要設計乙個照明系統,給出n種燈泡的電壓v,電源費用k,乙個燈泡的費用c和所需該種燈泡數量l,電壓小的燈泡可以被電壓大的燈泡代替,求最小花費。

由人類的直覺,我們應該把燈泡按照電壓從大到小排序,以方便處理。

推理1:一種燈泡要麼全部替換為另一種,要麼都不換。

證明

如果將燈泡t全部替換為燈泡i比都不替換優,那麼說明: ki

+ci∗

(li+

lt)+kt+

ci∗l

i+ct

∗lt

那麼ci∗

lt+ct∗

lt已經將t都換為i後,如果將部分燈泡換回t的話,還要再買乙個電源,花費kt

,並且燈泡**依據式子並不會帶來什麼優惠。

同理,如果不換更優,那麼再換一部分,由於ci

∗lt>kt

+ct∗

lt,也不會帶來任何優惠。

狀態轉移:令sum[i]表示電壓按照從大到小排序後,燈泡數量字首和。f[i]表示前i種燈泡處理好的最小**。

由人類的直覺,我們認為狀態轉移方程為: f[

i]=m

in(f

[i],

f[j−

1]+k

j+(s

um[i

]−su

m[j−

1])∗

cj)(

j≤i)

為什麼可以直接替換乙個區間呢?見推理2.

推理2:狀態轉移方程正確性證明。

證明: 設v

i>vj

>vt

如果t被i替換比較優的前提下,j不被t替換更優(即狀態轉移方程的反例)則: ki

+(li

+lj+

lt)∗

ci>ki

+kj+

(li+

lt)∗

ci+l

j∗cj

即:ci

∗lj>cj

∗lj+

kj即:ci

>cj

然而出現這種反例也沒關係,因為如果出現如上情況,我們讓j到i之間的燈泡全被j替換更優。現在我們證明這一點,則要證: ki

+kj+

(li+

lt)∗

ci+l

j∗cj

>ki

+kj+

li∗c

i+(l

t+lj

)∗cj

即要證:lt

∗ci>lt

∗cj

好吧,那麼一定成立。也就是狀態轉移方程正確性成立。

#include

#include

#include

#include

using

namespace

std;

int read()

int n,ans,sum[1005],f[1005];

struct nodea[1005];

bool cmp(node x,node y)

int main()

printf("%d\n",f[n]);

}return

0;}

uva11400 照明系統設計

通過這個題目我以為我了發現資料結構課本快排 的乙個bug。書上的快排 template void quicksort t a,int leftend,int rightend while a leftcursor pivot dowhile a rightcursor pivot if leftcu...

Uva 11400,照明系統設計

題意 有乙個照明系統需要用到n種燈,每種燈的電壓為v,電源費用k,每個燈泡費用為c,需要該燈的數量為l。注意到,電壓相同的燈泡只需要共享乙個對應的電源即可,還有電壓低的燈泡可以被電壓高的燈泡替代。為了節約成本,你將設計一種系統,使之最便宜。分析 每種電壓的燈泡要麼全換,要麼都不換,不然兩種電源都不要...

UVa11400 照明系統設計

題目描述 設計某個地方的照明系統 一共需要n種不同型別的燈泡 接著輸入每種燈泡的電壓v 對應電壓電源的 k 每個燈泡的 c 需要這種燈泡的數量l 電壓低的燈泡可以用電壓高的燈泡替換 每種燈泡只需要乙個對應的電源 求完成這個照明系統的最少花費。輸入有多組資料。輸出最小花費。樣例輸入 100 500 1...