UVA 11400"Lighting System Design"
参考资料:
[1]:https://www.cnblogs.com/Kiraa/p/5510757.html
题意:
现给你一套照明系统,这套照明系统共包含 n 种类型的灯;
其中第 i 中类型的灯包含四个参数:vi,ki,ci,li,分别表示
vi : 第 i 种类型的灯正常工作所需要的电压源;
ki : 购买电压源 vi 的花费;
ci : 第 i 种灯泡的单价;
li : 这套照明系统需要第 i 种灯的个数
购买第 i 种灯的花费为 costi = ki+ci×li;
总花费为 cost=∑costi;
有如下操作:
如果 vi ≤ vj , 那么便可将购买的灯 i 换成购买灯 j;
求对所有灯执行完上述操作后 cost 的最小值;
错误思路:
贪心策略,如果可以将灯 i 换成灯 j 并且可以使得 cost变小,那么就更换,并且更新 li = 0 , lj += li;
hack样例:
正确输出 690
实际输出 700错误分析:
初始,cost1=150 , cost2=220 , cost3=340;
首先可以判断,灯①可以全部换成灯②,换完后,l1=0,l2=15;
使得 cost1+cost2 = 150+14×15 = 360 < 150+220;
但是,此时灯②不能全部换成灯③,cost = cost1+cost2+cost3=360+340=700;
另一种方案是,灯②全部换成灯③,换完后 cost2+cost3=300+40*6=540 < 220+340;
灯①既不能换成灯②也不能换成灯③,此时,cost = 690 优于 700;
也就是说,将①换成灯②可以节省10元,但是如果将灯②换成灯③可以节省20元;
所以,此题的难点就在于对于可以更换的灯 i , j ,是否将灯 i 换成灯 j 呢?
分割线:2019.6.7
因为要准备考试 6.5 , 6.6 这两天晚上的考试,所以,一直到今天才补了这道题;
看着紫书上的状态转移方程证明了一下午;
来看看我今天一下午的成果:
首先将这 n 种灯按 v 升序排列;
经过上述操作后,使得总花费最小的方案一定是成片的,什么是成片的呢?
就是 (1,2,3,...,a-1)(a,...,i,...,b)(b+1,..,j,..,d)(...,n) 这么划分是使得总花费最小的划分方案;
(a,....,b) : 第 [a,...,b-1] 种灯都换成第 b 种灯;
为什么这就是答案呢?
为什么不能是穿插着是答案呢?
用反证法证明,对于 (a,...,i,...,b)(b+1,..,j,..,d) 这两个划分,假设将 i,j 互换后的划分为使得总花费最小的划分;
首先定义:
sum1 = la+la+1+...+li+...+lb;//[a,b]区间的总灯泡个数
sum2 = lb+1+lb+2+...+lj+...+ld;//[b+1,d]区间的总灯泡个数
//交换i,j灯泡后的总个数
sum3 = sum1-li+lj;
sum4 = sum2-lj+li;
sum = sum1+sum2 = sum3+sum4;
① cost{ (a,...,j,...,b)(b+1,..,i,..,d) } < cost{ (a,...,i,...,b)(b+1,..,j,..,d) };
② cost{ (a,...,j,...,b)(b+1,..,i,..,d) } < cost{ (a,............................,d) };
由①可得:
(kb+sum3×cb)+(kd+sum4×cd) < (kb+sum1×cb)+(kd+sum2×cd)
化简得:
(sum3-sum1)cb < (sum2-sum4)cd;
由②可得:
(kb+sum3×cb)+(kd+sum4×cd) < kd+sum×cd
化简得:
cb < cd;
正解:
首先可以得出这样一个结论:每种类型的灯泡,要么全换成其他类型的,要么全都不换;
定义dp[ i ]表示前 i 个灯泡得最小花费,sum[ i ]表示前 i 个灯泡得总个数;
对于两类灯泡 i 和 j,i 可以换成 j 的条件是:
1) vj > vi
2) j 一定存在于最优解中(保证 kj 不被省去)
3) ki+li×ci < li×cj
基于条件(1),首先将灯泡按照电压从小大到大排序;
假设前 i-1 个灯泡经过最优的替换后,新的灯泡序列为 b1,…,bj,bj+1,…bk(bi表示没被合并的灯泡编号,并且按照电压非降序排列);
bj 和 bj+1 的关系一定满足:
①kb[ j ]+lb[ j ]×cb[ [j ] < lb[ j ]*cb[ j+1](否则 bj 可被 bj+1 替换,与当前为最优解的假设矛盾);现在我们考虑用第 i 个灯泡 ai 替换的情况;
假设 bj 可以被 ai 替换,那么有
②kb[ j ]+lb[ j ]×cb[ j ] > lb[ j ]×ca[ i ];
由式 ①② 可得 ca[ i ] < cb[ j+1],即 bj+1 可被 ai 替换;
同理,bj+2~bk 的所有灯泡都可以被 ai 替换;
换句话说,对于前 i-1 个灯泡 a1~aj~ai-1,如果存在 j(1<j<i-1),aj+1可以被 ai 替换,
那么 aj+1~ai-1 的所有灯泡都可以被 ai 替换,而a1~aj 灯泡的最小费用已经算出为dp[ j ]。
这样我们就得出了 ai 的替换方法:前 j 个灯泡用之前计算出的最优方案 d[ j ] 购买,
剩下 j+1~i 个灯泡全用 ai 替换,枚举 j 从 0 到 i-1,根据前面的讨论得知不会漏解;
则状态转移方程 d[ j ]=min{ d[ j ]+c[ i ]×(s[ i ]-s[ j ])+k[ i ] };
最终答案就是 dp[n];
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define memF(a,b,n) for(int i=0;i<=n;a[i++]=b);
const int maxn=1e3+; int n;
struct Data
{
int v,k,c,l;
bool operator < (const Data &obj) const
{
return v < obj.v;
}
}_data[maxn];
int dp[maxn];
int sum[maxn]; int Solve()
{
sort(_data+,_data+n+);
sum[]=;
for(int i=;i <= n;++i)
sum[i]=sum[i-]+_data[i].l;
memF(dp,INF,n);
dp[]=;
for(int i=;i <= n;++i)
for(int j=;j < i;++j)
dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*_data[i].c+_data[i].k); return dp[n];
}
int main()
{
while(~scanf("%d",&n) && n)
{
for(int i=;i <= n;++i)
scanf("%d%d%d%d",&_data[i].v,&_data[i].k,&_data[i].c,&_data[i].l);
printf("%d\n",Solve());
}
return ;
}
UVA 11400"Lighting System Design"的更多相关文章
- 【线性结构上的动态规划】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)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa 11400 Lighting System Design
题意: 一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源.每种灯泡有四个参数: 电压值V.电源费用K.每个灯泡的费用C.所需该种灯泡的数量L 为了省钱,可以用电压高的灯泡来 ...
- 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(动态规划 最长上升子序列问题变型)
本题难处好像是在于 能够把一些灯泡换成电压更高的灯泡以节省电源的钱 .所以也才有了对最优方案的探求 好的处理方法是依照电压从小到大排序.仅仅能让前面的换成后面的.也就满足了把一些灯泡换成电压更高的灯泡 ...
- UVA 11400 Lighting System Design 照明系统设计
首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩 ...
- UVA - 11400 Lighting System Design(照明系统设计)(dp)
题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...
随机推荐
- 利用JDBC连接Oracle数据库(转)
http://blog.csdn.net/wahaha1_/article/details/8512438 JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 J ...
- 分布式Jmeter
遇到的问题 1.压力不够大 2.单台瓶颈 3.网络瓶颈 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为了用廉价的.普通的机器完成单个计算机 ...
- SELinux 宽容模式(permissive) 强制模式(enforcing) 关闭(disabled) 几种模式之间的转换
http://blog.sina.com.cn/s/blog_5aee9eaf0100y44q.html 在CentOS6.2 中安装intel 的c++和fortran 的编译器时,遇到来一个关于S ...
- axios细节之绑定到原型和axios的defaults的配置属性
把axios绑定到原型 vue开发者一套很好用的实践,一般来说,实践如果能够让大部分人都接受,会逐渐成为一个默认的标准. // 把axios配置到原型上 Vue.prototype.$axios = ...
- 手写call,bind,apply
//实现call var that = this ; //小程序环境 function mySymbol(obj){ let unique = (Math.random() + new Date(). ...
- WebGL three.js学习笔记 加载外部模型以及Tween.js动画
WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...
- 2019-11-19-git-修改commit日期为之前的日期
title author date CreateTime categories git 修改commit日期为之前的日期 lindexi 2019-11-19 08:53:16 +0800 2018- ...
- Java练习 SDUT-1294_选票统计
选票统计 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 某校学生会主席由全校学生投票选举产生,共有m名候选人报名参选, ...
- oracle函数 LOWER(c1)
[功能]:将字符串全部转为小写 [参数]:c1,字符表达式 [返回]:字符型 [示例] SQL> select lower('AaBbCcDd')AaBbCcDd from dual; AABB ...
- @bzoj - 4378@ [POI2015] Logistyka
目录 @description@ @solution@ @accepted code@ @details@ @description@ 维护一个长度为 n 的序列,一开始都是 0,支持以下两种操作: ...