链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2395

题意:

有n(n≤1000)种灯泡,不同种类的灯泡必须用不同的电源,但同一种灯泡可以共用一个电源。
每种灯泡用4个数值表示:电压值V(V≤132000),电源费用K(K≤1000),灯泡单价C(C≤10)和所需数量L(1≤L≤100)。
可以把一些灯泡换成电压更高的另一种灯泡以节省电源的钱(但不能换成电压更低的灯泡)。求最优方案的费用。

分析:

首先可以得到一个结论:每种灯泡要么全换,要么全不换。因为如果把1个灯泡A换成灯泡B能省钱的话,干脆全换得了。
先把灯泡按电压值从小到大排序,这样的话前面的灯泡可以换成后面的灯泡,反之不行。
然后依次考虑每一种灯泡,对于第i种灯泡,尝试将前x(0≤x<i)种灯泡用原来的最优方案,后面的灯泡全用第i种。
为什么是后面的(即连续的)呢?有没有不连续的情况呢?比如灯泡A,B,C(按电压值升序),会不会有A换成C,
而B不换成C的情况呢?答案是没有的。因为如果B不换成C,则必然有:电源B + 单价B * 数量B < 单价C * 数量B。
可见A换成B更优,所以不会出现这种情况。
设sum[i]为前i种灯泡的总数量(即L值之和),d[i]为前i种灯泡的最小费用,
则d[i] = min{d[j] + (sum[i]-sum[j])*c[i] + k[i]},0≤j<i(d[0]表示全用第i种)。答案为d[n]。

代码:

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. const int UP = + ;
  6. struct LAMP {
  7. int V, K, C, L; //电压,电源费,单价,数量
  8. bool operator < (const LAMP& that) const {
  9. return V < that.V;
  10. }
  11. } a[UP];
  12.  
  13. int sum[UP], d[UP]; //sum[x]表示前x种灯泡的总数量,d[x]表示前x种灯泡的最小费用
  14.  
  15. int main(){
  16. int n;
  17. while(scanf("%d", &n) && n){
  18. for(int i = ; i < n; i++)
  19. scanf("%d%d%d%d", &a[i].V, &a[i].K, &a[i].C, &a[i].L);
  20. sort(a, a + n);
  21.  
  22. sum[] = a[].L;
  23. for(int i = ; i < n; i++) sum[i] = sum[i-] + a[i].L;
  24. for(int i = ; i < n; i++){
  25. d[i] = sum[i] * a[i].C + a[i].K; //前sum[i]个灯泡都用类型i
  26. for(int t = ; t < i; t++)
  27. d[i] = min(d[i], d[t] + (sum[i] - sum[t]) * a[i].C + a[i].K);
  28. }
  29. printf("%d\n", d[n-]);
  30. }
  31. return ;
  32. }

UVa 11400 - Lighting System Design(线性DP)的更多相关文章

  1. UVa 11400 Lighting System Design【DP】

    题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...

  2. UVA - 11400 Lighting System Design (区间DP)

    这个问题有两个点需要注意: 1. 对于一种灯泡,要么全换,要么全不换. 证明: 设一种灯泡单价为p1,电池价格为k1,共需要L个,若把L1个灯泡换成单价为p2,电池为k2的灯泡,产生的总花费为p1*L ...

  3. 【线性结构上的动态规划】UVa 11400 - Lighting System Design

    Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...

  4. UVa 11400 Lighting System Design(DP 照明设计)

    意甲冠军  地方照明系统设计  总共需要n不同类型的灯泡  然后进入 每个灯电压v  相应电压电源的价格k  每一个灯泡的价格c   须要这样的灯泡的数量l   电压低的灯泡能够用电压高的灯泡替换   ...

  5. UVA - 11400 Lighting System Design(照明系统设计)(dp)

    题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...

  6. UVA 11400"Lighting System Design"

    传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...

  7. UVa 11400 Lighting System Design

    题意: 一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源.每种灯泡有四个参数: 电压值V.电源费用K.每个灯泡的费用C.所需该种灯泡的数量L 为了省钱,可以用电压高的灯泡来 ...

  8. uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)

    本题难处好像是在于 能够把一些灯泡换成电压更高的灯泡以节省电源的钱 .所以也才有了对最优方案的探求 好的处理方法是依照电压从小到大排序.仅仅能让前面的换成后面的.也就满足了把一些灯泡换成电压更高的灯泡 ...

  9. UVA 11400 Lighting System Design 照明系统设计

    首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩 ...

随机推荐

  1. 忘记root密码的解决方法——进入单用户模式修改

    (1)在系统还在读秒的时候按任意键,你会看到如下界面: 然后按下‘e’

  2. 公司管理系列--Facebook是如何营造企业文化的[转]

      本文讲下硅谷创业公司的文化,去过硅谷公司或者是看过硅谷公司报道的人,都会惊讶硅谷创业公司里面有如此奇特且活力十足的文化.在中国,企业文化是一个被滥用但是却又缺乏解读的概念,很多国内企业对保持公司的 ...

  3. AngularJS的日期格式化有两种形式

    AngularJS的日期格式化有两种形式,一种是在HTML页面,一种是在JS代码里,都是用到AngularJS的过滤器$filter. HTML: date_expression 即 你在$scope ...

  4. 四:SpringThinking

    一:将对象配置到容器 1.xml文件:空参构造 <bean name="user" class="com.spring.bean.User" scope= ...

  5. CentOS 启动-运行级别

    Linux系统的启动过程:内核的引导 > 运行init > 系统初始化 > 建立终端 > 用户登录系统 运行init init 进程是系统所有进程的起点: 主要功能: 准备软件 ...

  6. SQLSTATE[HY000] [2002] No such file or directory in

    这个错误将数据库配置信息的localhost改成127.0.0.1就行了

  7. flask 继承模版的基本使用1

  8. webstorm添加自定义代码块

    widnow下使用alt+ctrl+s 调出setting面板 mac下使用command+,(逗号)调出Preferences面板 搜索live template选中js,在javascrpt 模板 ...

  9. siriWave.js的demo

    demo.html <style>body { background: #000; }</style> <script src="../siriwave.js& ...

  10. android popupwindow位置显示

    1.在控件的上方: private void showPopUp(View v) { LinearLayout layout = new LinearLayout(this); layout.setB ...