UVa 11400 Lighting System Design

题意:

一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源。每种灯泡有四个参数:

电压值V、电源费用K、每个灯泡的费用C、所需该种灯泡的数量L

为了省钱,可以用电压高的灯泡来代替电压低的灯泡。输出最小费用。

分析:

每种电源的灯泡要么不换要么全换,因为只换部分的话,两种类型的电源都要买,不划算。

将电压从小到大排序,s[i]表示前i种灯泡一共需要多少个灯泡,d[i]表示前i种灯泡最少费用。

d[i] = min{d[j] + (s[i] - s[j]) * c[i] + k[i]} (j = 0,,,i-1) (表示前j种灯泡用最优解,第j+1~i 种都被第 i 种灯泡所替换而且用第i种电源)

 

 1 //#define LOCAL

 2 #include <iostream>

 3 #include <cstdio>

 4 #include <cstring>

 5 #include <algorithm>

 6 using namespace std;

 7 

 8 const int maxn = 1000 + 10;

 9 struct Lamp

10 {

11     int v, k, c, l;

12     bool operator< (const Lamp& a) const

13     {

14         return v < a.v;

15     }

16 }lamps[maxn];

17 int s[maxn], d[maxn];

18 

19 int main(void)

20 {

21     #ifdef LOCAL

22         freopen("11400in.txt", "r", stdin);

23     #endif

24 

25     int n;

26     while(scanf("%d", &n) == 1 && n)

27     {

28         for(int i = 1; i <= n; ++i)

29             scanf("%d%d%d%d", &lamps[i].v, &lamps[i].k, &lamps[i].c, &lamps[i].l);

30         sort(lamps + 1, lamps + 1 + n);

31         s[0] = 0;

32         for(int i = 1; i <= n; ++i)    s[i] = s[i-1] + lamps[i].l;

33 

34         d[0] = 0;

35         for(int i = 1; i <= n; ++i)

36         {

37             d[i] = d[i-1] + lamps[i].c * lamps[i].l + lamps[i].k;    //用第i种灯泡和电源

38             for(int j = 0; j < i; ++j)

39             {//前j种灯泡用最优解,第j+1~i 种都被第 i 种灯泡所替换而且用第i种电源

40                 d[i] = min(d[i], d[j] + (s[i] - s[j]) * lamps[i].c + lamps[i].k);

41             }

42         }

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

44     }

45 

46     return 0;

47 }
代码君

 

你可能感兴趣的:(System)