UVa 11400 - Lighting System Design(线性DP)
链接:
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]。
代码:
#include <cstdio>
#include <algorithm>
using namespace std; const int UP = + ;
struct LAMP {
int V, K, C, L; //电压,电源费,单价,数量
bool operator < (const LAMP& that) const {
return V < that.V;
}
} a[UP]; int sum[UP], d[UP]; //sum[x]表示前x种灯泡的总数量,d[x]表示前x种灯泡的最小费用 int main(){
int n;
while(scanf("%d", &n) && n){
for(int i = ; i < n; i++)
scanf("%d%d%d%d", &a[i].V, &a[i].K, &a[i].C, &a[i].L);
sort(a, a + n); sum[] = a[].L;
for(int i = ; i < n; i++) sum[i] = sum[i-] + a[i].L;
for(int i = ; i < n; i++){
d[i] = sum[i] * a[i].C + a[i].K; //前sum[i]个灯泡都用类型i
for(int t = ; t < i; t++)
d[i] = min(d[i], d[t] + (sum[i] - sum[t]) * a[i].C + a[i].K);
}
printf("%d\n", d[n-]);
}
return ;
}
UVa 11400 - Lighting System Design(线性DP)的更多相关文章
- UVa 11400 Lighting System Design【DP】
		
题意:给出n种灯泡,分别给出它们的电压v,电源费用k,每个灯泡的费用c,和所需灯泡的数量l,问最优方案的费用 看的紫书= = 首先是dp[i]为灯泡1到i的最小费用, dp[i]=min(dp[i], ...
 - UVA - 11400 Lighting System Design (区间DP)
		
这个问题有两个点需要注意: 1. 对于一种灯泡,要么全换,要么全不换. 证明: 设一种灯泡单价为p1,电池价格为k1,共需要L个,若把L1个灯泡换成单价为p2,电池为k2的灯泡,产生的总花费为p1*L ...
 - 【线性结构上的动态规划】UVa 11400 - Lighting System Design
		
Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the tas ...
 - UVa 11400 Lighting System Design(DP 照明设计)
		
意甲冠军 地方照明系统设计 总共需要n不同类型的灯泡 然后进入 每个灯电压v 相应电压电源的价格k 每一个灯泡的价格c 须要这样的灯泡的数量l 电压低的灯泡能够用电压高的灯泡替换 ...
 - 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"
		
传送门 错误思路 正解 AC代码 参考资料: [1]:https://www.cnblogs.com/Kiraa/p/5510757.html 题意: 现给你一套照明系统,这套照明系统共包含 n 种类 ...
 - UVa 11400 Lighting System Design
		
题意: 一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源.每种灯泡有四个参数: 电压值V.电源费用K.每个灯泡的费用C.所需该种灯泡的数量L 为了省钱,可以用电压高的灯泡来 ...
 - uva 11400 - Lighting System Design(动态规划 最长上升子序列问题变型)
		
本题难处好像是在于 能够把一些灯泡换成电压更高的灯泡以节省电源的钱 .所以也才有了对最优方案的探求 好的处理方法是依照电压从小到大排序.仅仅能让前面的换成后面的.也就满足了把一些灯泡换成电压更高的灯泡 ...
 - UVA 11400 Lighting System Design 照明系统设计
		
首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩 ...
 
随机推荐
- linux系统mysql主主复制(双主复制)
			
一.简介 在上一篇的主从复制中:http://www.cnblogs.com/lay2017/p/9043985.html 我们了解到,mysql通过master写日志,slave读取并执行日志内容从 ...
 - 流畅的python和cookbook学习笔记(二)
			
1.元组拆包和解压序列赋值 任何的序列 (或者是可迭代对象) 可以通过一个简单的赋值语句解压并赋值给多个 变量.唯一的前提就是变量的数量必须跟序列元素的数量是一样的. 1.平行赋值: >> ...
 - 学会Markdown,写博客不愁
			
前言 Markdown是一种轻量级的标记语言,有John Gruber以及Aaron Hillel Swartz一起编写.Aaron Hillel Swartz是一个极富传奇的黑客,有兴趣可以看看他的 ...
 - 数据上下文中的AddOrUpdate方法
			
AddOrUpdate是扩展方法,需要添加引用 using System.Data.Entity.Migrations;
 - Maven 配置tomcat和findbug插件(在eclipse建立的项目中)
			
tomcat插件 a) tomcat的maven插件可以在tomcat的官网上寻找,这就是tomcat插件的plugin b) 将tomcat的plugin配置到项目的po ...
 - mybatis向数据库插入数据 (传入的是一个实体类)
			
/** * 插入用户信息 user为实体类 * @param user */ public int insert( User user); //实体类不用@param标注 //mybatis的xml文 ...
 - BZOJ2763: [JLOI2011]飞行路线(分层图 最短路)
			
题意 题目链接 Sol 分层图+最短路 建\(k+1\)层图,对于边\((u, v, w)\),首先在本层内连边权为\(w\)的无向边,再各向下一层对应的节点连边权为\(0\)的有向边 如果是取最大最 ...
 - .NET开源工作流RoadFlow-流程运行-调试
			
我们在设计好流程后,往往要先经过测试,把整个流程走遍,但是一个流程要多人审批才能走完,这样换别人账号来测试流程很麻烦. 所以我们设计了一种调试模式,即可以在流程运行时看到相关信息(错误时会显示错误信息 ...
 - Android setTag()/getTag()
			
View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来. 可以用在多个Button添加一个监听器,每个Button都设置不同的setTag ...
 - android之键盘转载
			
显示键盘: EditText editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.request ...