有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...