题目链接 https://cn.vjudge.net/problem/UVA-11400

【题意】

你的任务是设计一个照明系统,一共有n(n<=1000)个灯泡可以选择,不同种类的灯必须使用不同的电源,但同种灯泡可以共用一个电源,每种灯泡有4个属性,电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和每种灯泡的数量L(L<=100)

为了省钱,你可以把一些低电压灯泡换成电压更高的灯泡,你的任务是计算出最优方案的费用是多少。

【输入格式】

第一行为一个整数n,表示有n中不同的灯泡,n=0代表输入结束。下面n行每行4个整数,分别是每种灯泡的电压,电源费用,单价和数量。

【输出格式】

输出一个整数即最小费用。

【样例输入】

3

100 500 10 20

120 600 8 16

220 400 7 18

0

【样例输出】

778

【思路】

这道题有两个最绕的地方。我先说结论再证明,第一个是对于某种灯泡来说,要么干脆全不换,要么干脆全都换成更高电压的一种灯泡。第二个是如果我们按照电压升序的规则对每种灯泡排序,那么一定是把连续的一段对应的灯泡换掉才能产生最优解,举个例子说,假如有若干种灯泡已经按照电压排好顺序,那么用第四种灯泡替换掉第一种和第三种一定不是最优解,用第四种把前三种全换掉一定更优!

证明如下。先说第一条,直观理解,如果说现在有两种灯泡,第一种的电压小于第二种。假设把第一种的若干个(不是全部)用第二种替换是最优解,那么也就说明第二种的单价一定小于第一种的,所以才能更省钱,那既然这样,直接全部把第一种换完,连第一种的电源都不用买不是更好么?所以原则是要么全换,要么全不换。当然我开始是拿数学式子推的,设两种灯泡k1,c1,l1;k2,c2,l2然后设用x件第二种灯泡换掉第一种,求花费的表达式

w=k1+k2+c1*l1+c2*l2+(c2-c1)*x(x<l1)

=k2+c2*l1+c2*l2(x==l1)

上式-下式=k1+(c1-c2)(l1-x),所以当c1>=c2时,上式>=下式,也就是说一定要拿单价小的灯泡把单价大的灯泡换掉。

对于第二条,想明白了这一点是dp的关键。就拿刚才的例子来说,假如有若干种灯泡已经按照电压排好顺序,假如用第四种灯泡替换掉第一种和第三种是最优解,那么第二种灯泡的单价一定小于第一种灯泡的单价(不然就不是最优了,应该直接那第四种把第二种也换掉才对呀),而如果说第二种灯泡的单价小于第一种灯泡,那么再拿第二种灯泡换掉第一种灯泡就可以产生一个更优解,与假设矛盾,所以也就证明了第二条结论。

设dp[i]是购买前i种灯泡的最小花费,则递推公式为dp[i]=min{dp[j]+(s[i]-s[j])*a[i].c+a[i].k|0<=j<i}dp[0]=0 s[i]指前i中灯泡的总需求量。

#include<bits/stdc++.h>
using namespace std;const int inf=2e9;
const int maxn=1050;struct node{int v,k,c,L;node(int vv=0,int kk=0,int cc=0,int LL=0):v(vv),k(kk),c(cc),L(LL){}bool operator<(const node& e)const{return v<e.v;}
};int n;
node light[maxn];
int dp[maxn],s[maxn];int main(){cin.tie(0);ios_base::sync_with_stdio(0);while(cin>>n && n){memset(s,0,sizeof(s));for(int i=0;i<n;++i){int v,k,c,L;cin>>v>>k>>c>>L;light[i]=node(v,k,c,L);}sort(light,light+n);s[0]=light[0].L;for(int i=1;i<n;++i){s[i]=s[i-1]+light[i].L;}fill(dp,dp+n,inf);dp[0]=light[0].k+light[0].c*light[0].L;for(int i=1;i<n;++i){dp[i]=min(dp[i],s[i]*light[i].c+light[i].k);for(int j=0;j<i;++j){dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*light[i].c+light[i].k);}}cout<<dp[n-1]<<endl;}return 0;
}

转载于:https://www.cnblogs.com/wafish/p/10465464.html

Uva 11400 - Lighting System Design (DP)相关推荐

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

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

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

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

  3. UVa 11400 Lighting System Design

    题目:Lighting System Design 题意: 来自luogu-- 给定 n(n≤1000)n(n≤1000) 种类型灯泡,每个灯泡给出其电压 v(v≤132000)v(v≤132000) ...

  4. uva 11400——Lighting System Design

    题意: 给定一些灯泡,每种灯泡有不同的电压v,电源费用k,每个灯泡的费用c,所需的灯泡的数量L,同种灯泡可以使用相同电源,问最小花费. 思路:dp,每种灯泡要么选要么不选两种状态,状态转移方程是d(i ...

  5. UVA11400 照明系统设计 Lighting System Design(线性DP)

    整理的算法模板合集: ACM模板 传送门 因为只能被电压更高的灯泡替换,所以我们按照电压排序,相当于是一个上升子序列,或者说找一个上升子序列 每一种灯泡都有一个需求量,相当于用这个灯泡就需要买这么全部 ...

  6. 激光雷达Lidar Architecture and Lidar Design(下)

    激光雷达Lidar Architecture and Lidar Design(下) Considerations on Lidar Design 双基地还是单基地? 双轴还是同轴? 几何重叠 向上还 ...

  7. 激光雷达Lidar Architecture and Lidar Design(上)

    激光雷达Lidar Architecture and Lidar Design(上) 介绍 激光雷达结构: 基本条件 构型和基本布置 激光雷达设计: 基本思想和基本原则 总结 介绍 激光雷达结构是激光 ...

  8. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  9. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

最新文章

  1. CentOS 6.3 64bit上升级系统默认Python 2.6.6到2.7.10版本
  2. sdi线缆标准_Roland V1SDI——专业、便携、高性价比的SDI摄像机直播解决方案
  3. Hbase 技术细节笔记(上)
  4. 3分钟看完 Day2 Keynote
  5. Delphi 完整的Bug决议工具EurekaLog的使用
  6. 数据结构之基于Java的最优二叉树实现
  7. 加油站都需要什么手续_公司变更需要什么手续
  8. 查找表_leetcode454
  9. python定义私有变量的方法_Python中私有属性的定义方式
  10. [INet] WebSocket 数据收发的详细过程
  11. java基础案例教程第二章_Java基础案例教程
  12. 为什么我要弃用Snapchat?
  13. WINDOWS系统文件夹、实用自带工具、DOS、进程等,解析集合(积累)较实用...
  14. iOS 15 UITableView Section间距变大
  15. 详解Jetpack Compose中的Modifier修饰符
  16. 微信 商店服务器,对比saas小程序,云开发,微信小商店
  17. Android使用Mp4v2用h264流和aac流合成mp4
  18. 压缩包密码忘记了打不开?教你用pyhton轻松解决,附视频讲解
  19. MySQL 安全方案设计
  20. 一步一步实现一个完整的围棋游戏

热门文章

  1. Linux命令之route - 显示和操作IP路由表
  2. 脚本SFTP定时取Linux服务器文件
  3. min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高
  4. php ImageMagick扩展
  5. 旺铺免费,淘宝的义务不能免
  6. android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...
  7. 一篇文章让你了解区块链技术的发展阶段
  8. linux下安装sbt_如何在Linux上安装SBT
  9. 数据结构面试题编程题_您下次编程面试时应该了解的顶级数据结构
  10. 二分法典例:木棒切割问题