【Uva 11400】Lighting System Design
【Link】:
【Description】
你要构建一个供电系统;
给你n种灯泡来构建这么一个系统;
每种灯泡有4个参数
1.灯泡的工作电压
2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的所有灯泡使用);
3.灯泡的单个价格
4.灯泡的所需个数;
现在,你可以把某一些灯泡换成另外一种灯泡电压要严格更高;
然后所需的灯泡个数不变,其他的都变成另外一种电压的属性;
问你最少需要花费多少钱构建这么一个供电系统;
(即买电源的钱+买灯泡的钱)
【Solution】
把所有的灯泡,按照电压的大小升序排;
设f[i]表示1..i这i个灯泡所需要的最小值;
则有
f[i]=min(f[j]+(sum[i]−sum[j])∗c[i]+k[i])
j∈[0..i−1]
sum[i]是灯泡数量的前缀和;
这个转移总是连续一段地把灯泡都转换成同一个有更大的电压的灯泡;
因为,我们可以保证总是这样连续一段都转成同一个灯泡的;
比如
1 2 3 4 5
假设最后最优的答案,3变成了5,但是4没有变成5;
我们可以肯定,这种情况是不可能的;
因为这里4没有变成5,就说明,4变成5是不划算的
也就是说4这个灯泡更便宜
这么看来,3没有必要变成5;
肯定是3变成4更优;
所以得到结论,肯定都是连续地一段变成了某一个灯泡,中间不可能有间断的没变的灯泡;
反证法??
【NumberOf WA】
0
【Reviw】
这种排除中间不会有间断的,只能是连续一段转移的思维方式值得思考;
【Code】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1100;
const int INF = 0x3f3f3f3f;
struct abc{
int v,k,c,l;
};
int n,sum[N],dp[N];
abc a[N];
bool cmp(abc a,abc b){
return a.v < b.v;
}
int main(){
//Open();
//Close();
while (~scanf("%d",&n) && n){
rep1(i,1,n)
scanf("%d%d%d%d",&a[i].v,&a[i].k,&a[i].c,&a[i].l);
sort(a+1,a+1+n,cmp);
sum[0] = 1;
rep1(i,1,n)
sum[i] = sum[i-1] + a[i].l;
ms(dp,INF);
dp[0] = 0,dp[1] = a[1].k + a[1].c*a[1].l;
rep1(i,2,n){
rep1(j,0,i-1)
dp[i] = min(dp[i],dp[j] + (sum[i]-sum[j])*a[i].c + a[i].k);
}
printf("%d\n",dp[n]);
}
return 0;
}
【Uva 11400】Lighting System Design的更多相关文章
- UVA - 11400 Lighting System Design
题文: You are given the task to design a lighting system for a huge conference hall. After doing a lot ...
- 【神仙DP】【UVa11400】Lighting System Design
传送门 Description Translation 题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为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 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- (动态规划)UVA-11400:Lighting System Design
You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...
- 【UVa 10881】Piotr's Ants
Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...
- 【UVa 116】Unidirectional TSP
[Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
随机推荐
- jquery动态表格,动态添加表格行
转载收藏于:https://www.cnblogs.com/zhangqs008/archive/2013/05/09/3618459.html 效果图: Html:<html> &l ...
- Unknown column 't_user.id' in 'where clause'(通过字段名删除不了数据)
创建员工信息表t_user CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) , passwor ...
- 计算机组成原理--64位CPU装载32位操作系统,它的寻址能力还是4GB吗?
借由这个问题,今天我们就把 32 位 CPU.64 位 CPU.32 位操作系统.64 位操作系统之间的区别与联系彻底搞清楚.对于这个问题,博主也是一知半解了好长时间啊~ 基本概念 32位的CPU与6 ...
- Python中编写精美图形界面(PyQt5)
纯代码,布局的讲解 见: https://cloud.tencent.com/developer/article/1345469 Qt designer设计文件 .ui转 .py文件,进阶使用 注:不 ...
- oracle和mysql的分页
如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的 ...
- Mysql学习总结(21)——MySQL数据库常见面试题
1. 如何使用SELECT语句找到你正在运行的服务器的版本并打印出当前数据库的名称? 答:下面的语句的结果会显示服务器的版本和当前的数据库名称 mysql> SELECT VERSION(), ...
- leetcode 刷题之路 66 Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- mysql-创建和操作表
一.建表 为了用程序创建表,我们可以使用SQL的create table 语句.如下: 每个列之间用逗号隔开,每列的定义以列名开始,后跟列的数据类型. 表的主键可以在创建表时用primary key关 ...
- Android子线程创建Handler方法
如果我们想在子线程上创建Handler,通过直接new的出来是会报异常的比如: new Thread(new Runnable() { public void run() { Handler hand ...
- Thinkphp5.0怎么加载css和js
Thinkphp5.0怎么加载css和js 问题 http://localhost/手册上的那个{load href="/static/css/style.css" /} 读取不到 ...