Uva 11400 - Lighting System Design (DP)
题目链接 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)相关推荐
- UVA - 11400 Lighting System Design(照明系统设计)(dp)
题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...
- uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
本题难处好像是在于 能够把一些灯泡换成电压更高的灯泡以节省电源的钱 .所以也才有了对最优方案的探求 好的处理方法是依照电压从小到大排序.仅仅能让前面的换成后面的.也就满足了把一些灯泡换成电压更高的灯泡 ...
- UVa 11400 Lighting System Design
题目:Lighting System Design 题意: 来自luogu-- 给定 n(n≤1000)n(n≤1000) 种类型灯泡,每个灯泡给出其电压 v(v≤132000)v(v≤132000) ...
- uva 11400——Lighting System Design
题意: 给定一些灯泡,每种灯泡有不同的电压v,电源费用k,每个灯泡的费用c,所需的灯泡的数量L,同种灯泡可以使用相同电源,问最小花费. 思路:dp,每种灯泡要么选要么不选两种状态,状态转移方程是d(i ...
- UVA11400 照明系统设计 Lighting System Design(线性DP)
整理的算法模板合集: ACM模板 传送门 因为只能被电压更高的灯泡替换,所以我们按照电压排序,相当于是一个上升子序列,或者说找一个上升子序列 每一种灯泡都有一个需求量,相当于用这个灯泡就需要买这么全部 ...
- 激光雷达Lidar Architecture and Lidar Design(下)
激光雷达Lidar Architecture and Lidar Design(下) Considerations on Lidar Design 双基地还是单基地? 双轴还是同轴? 几何重叠 向上还 ...
- 激光雷达Lidar Architecture and Lidar Design(上)
激光雷达Lidar Architecture and Lidar Design(上) 介绍 激光雷达结构: 基本条件 构型和基本布置 激光雷达设计: 基本思想和基本原则 总结 介绍 激光雷达结构是激光 ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
最新文章
- CentOS 6.3 64bit上升级系统默认Python 2.6.6到2.7.10版本
- sdi线缆标准_Roland V1SDI——专业、便携、高性价比的SDI摄像机直播解决方案
- Hbase 技术细节笔记(上)
- 3分钟看完 Day2 Keynote
- Delphi 完整的Bug决议工具EurekaLog的使用
- 数据结构之基于Java的最优二叉树实现
- 加油站都需要什么手续_公司变更需要什么手续
- 查找表_leetcode454
- python定义私有变量的方法_Python中私有属性的定义方式
- [INet] WebSocket 数据收发的详细过程
- java基础案例教程第二章_Java基础案例教程
- 为什么我要弃用Snapchat?
- WINDOWS系统文件夹、实用自带工具、DOS、进程等,解析集合(积累)较实用...
- iOS 15 UITableView Section间距变大
- 详解Jetpack Compose中的Modifier修饰符
- 微信 商店服务器,对比saas小程序,云开发,微信小商店
- Android使用Mp4v2用h264流和aac流合成mp4
- 压缩包密码忘记了打不开?教你用pyhton轻松解决,附视频讲解
- MySQL 安全方案设计
- 一步一步实现一个完整的围棋游戏
热门文章
- Linux命令之route - 显示和操作IP路由表
- 脚本SFTP定时取Linux服务器文件
- min聚合函数查询带有额外字段sql|dense_rank()over(partition)|+班级学生成绩最高
- php ImageMagick扩展
- 旺铺免费,淘宝的义务不能免
- android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...
- 一篇文章让你了解区块链技术的发展阶段
- linux下安装sbt_如何在Linux上安装SBT
- 数据结构面试题编程题_您下次编程面试时应该了解的顶级数据结构
- 二分法典例:木棒切割问题