Uva 11400,照明系统设计

题目链接:https://uva.onlinejudge.org/external/114/11400.pdf

题意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L。注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代。为了节约成本,你将设计一种系统,使之最便宜。

分析:每种电压的灯泡要么全换,要么都不换,不然两种电源都不要。因为低电压灯泡可以用较高的电源。按电压从低到高排一遍。

设s[i] 前 i 种灯泡的总数量, d[i] 为灯泡1~i的最小开销,d[i] = min(d[j]+(s[i]-s[j])*c[i]+k[i]),前 j 个先用最优方案,后面的 j+1~i都用第 I 号的电源。

#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1000 + 5;

struct Lamp {
  int v, k, c, l;
  bool operator < (const Lamp& rhs) const {
    return v < rhs.v;
  }
} lamp[maxn];

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

int main() {
  while(cin >> n && n) {
    for(int i = 1; i <= n; i++)
      cin >> lamp[i].v >> lamp[i].k >> lamp[i].c >> lamp[i].l;
    sort(lamp+1, lamp+n+1);
    s[0] = 0;
    for(int i = 1; i <= n; i++) s[i] = s[i-1] + lamp[i].l;
    d[0] = 0;
    for(int i = 1; i <= n; i++) {
      d[i] = s[i] * lamp[i].c + lamp[i].k; // 前i个灯泡全买类型i
      for(int j = 1; j <= i; j++)
        d[i] = min(d[i], d[j] + (s[i] - s[j]) * lamp[i].c + lamp[i].k);
    }
    cout << d[n] << "
";
  }
  return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5991014.html