uva 11400 - Lighting System Design

一时失言乱红尘 2021-12-19 02:55 284阅读 0赞

题意:给出n个模式,每个模式有电压v,电压费用k,每盏灯的花费c以及灯数l。然后电压高的可以用于电压低的。问说最少花费多少钱可以满足n个模式。

分析:每种电压的灯泡要么全换,要么都不换,不然两种电源都不要。因为低电压灯泡可以用较高的电源。按电压从低到高排一遍。设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 号的电源。

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn = 1000 + 5;
  5. struct Lamp
  6. {
  7. int v, k, c, l;
  8. bool operator < (const Lamp& rhs) const
  9. {
  10. return v < rhs.v;
  11. }
  12. } lamp[maxn];
  13. int n, s[maxn], d[maxn];
  14. int main()
  15. {
  16. while(cin >> n && n)
  17. {
  18. for(int i = 1; i <= n; i++)
  19. cin >> lamp[i].v >> lamp[i].k >> lamp[i].c >> lamp[i].l;
  20. sort(lamp+1, lamp+n+1);
  21. s[0] = 0;
  22. for(int i = 1; i <= n; i++) s[i] = s[i-1] + lamp[i].l;
  23. d[0] = 0;
  24. for(int i = 1; i <= n; i++)
  25. {
  26. d[i] = s[i] * lamp[i].c + lamp[i].k; // 前i个灯泡全买类型i
  27. for(int j = 1; j <= i; j++)
  28. d[i] = min(d[i], d[j] + (s[i] - s[j]) * lamp[i].c + lamp[i].k);
  29. }
  30. cout << d[n] << "\n";
  31. }
  32. return 0;
  33. }

#

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 uva 10110——Light, more light

    题意:当时还挺绕人,讲的就是一个走廊里有n个灯,一个人(疯了)来回在走廊里转,走第i 圈的时候将灯数能够整除i的灯号改变一下开关,问最后的时候(走n圈的)最后一个灯是明还是暗?