UVa 11400 照明系统设计

https://vjudge.net/problem/UVA-11400

题意:

有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L。注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代。为了节约成本,你将设计一种系统,使之最便宜。

思路:

这道题和我之前做的POJ 1260(具体也可以看一下这题) 基本上是一样的,首先是按电压排序,设sum[i]为前i种灯泡的总数量,d[i]为灯泡1~i的最小开销,则d[i]=min{d[j]+(sum[i]-sum[j])*c[i]+k[i])},表示前j个先用最优方案买,然后第j+1~i个都用第i号的电源。答案为d[n]。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5
 6 const int maxn = 1000 + 10;
 7
 8 int n;
 9 int d[maxn];
10 int sum[maxn];
11
12 struct node
13 {
14     int v, k, c, l;
15 }a[maxn];
16
17 bool cmp(node a, node b)
18 {
19     return a.v < b.v;
20 }
21
22
23 int main()
24 {
25     //freopen("D:\\txt.txt", "r", stdin);
26     while (cin >> n && n)
27     {
28
29         for (int i = 1; i <= n; i++)
30         {
31             cin >> a[i].v >> a[i].k >> a[i].c >> a[i].l;
32         }
33         sort(a + 1, a + n + 1, cmp);
34
35         sum[0] = 0;
36         for (int i = 1; i <= n; i++) {
37             sum[i] = sum[i - 1] + a[i].l;
38         }
39         d[0] = 0;
40         for (int i = 1; i <= n; i++) {
41             d[i] = d[i - 1] + a[i].c*a[i].l + a[i].k;    //未优化之前的购买方式
42             for (int j = 0; j < i; j++) {
43                 d[i] = min(d[i], d[j] + (sum[i] - sum[j]) * a[i].c + a[i].k);
44             }
45         }
46         cout << d[n] << endl;
47     }
48     return 0;
49 }
时间: 2024-12-25 23:57:48

UVa 11400 照明系统设计的相关文章

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

本题难处好像是在于 可以把一些灯泡换成电压更高的灯泡以节省电源的钱 ,所以也才有了对最优方案的探求 好的处理方法是按照电压从小到大排序,只能让前面的换成后面的,也就满足了把一些灯泡换成电压更高的灯泡 的要求: 一种电压的灯泡,要么不换,要换则应该全换:换,说明用当前的电源不值:而既然不值则应该全部换掉以避免使用当前电源,不然即增加了灯泡费用又没节省电源费用,亏大了... 状态转移详见代码 #include<cstdio> #include<cstring> #include<

UVa 11400 Lighting System Design(DP 照明设计)

意甲冠军  地方照明系统设计  总共需要n不同类型的灯泡  然后进入 每个灯电压v  相应电压电源的价格k  每一个灯泡的价格c   须要这样的灯泡的数量l   电压低的灯泡能够用电压高的灯泡替换   每种灯泡仅仅须要一个相应的电源   求完毕这个照明系统的最少花费 比較简单的DP  easy知道 当要替换一种灯泡中的一个到令一种电压较高的灯泡时  仅仅有所有替换这样的灯泡为还有一种时才可能使总花费变小   所有替换掉就省下了这样的灯泡的电源花费   先把灯泡依照电压排序   那么每种灯泡都能够

UVa 11400 Lighting System Design(DP 照明系统设计)

题意  设计某个地方的照明系统  一共需要n种不同类型的灯泡  接着输入 每种灯泡的电压v  对应电压电源的价格k  每个灯泡的价格c   需要这种灯泡的数量l   电压低的灯泡可以用电压高的灯泡替换   每种灯泡只需要一个对应的电源   求完成这个照明系统的最少花费 比较简单的DP  容易知道 当要替换一种灯泡中的一个到令一种电压较高的灯泡时  只有全部替换这种灯泡为另一种时才可能使总花费变小   全部替换掉就省下了这种灯泡的电源花费   先把灯泡按照电压排序   那么每种灯泡都可以替换他前面

UVA 11400 Lighting System Design 照明系统设计

首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩脱了... #include<bits/stdc++.h> using namespace std; const int maxn = 1e3+3; int V[maxn], K[maxn], C[maxn], L[maxn]; int d[maxn],r[maxn],s[maxn]; bool

【线性结构上的动态规划】UVa 11400 - Lighting System Design

Problem F Lighting System Design Input: Standard Input Output: Standard Output You are given the task to design a lighting system for a huge conference hall. After doing a lot of calculation & sketching, you have figured out the requirements for an e

UVA 11400 Lighting System Design DP

最优情况不可能跨过一种灯泡,为什么? 因为如果A换成C是划算的那么如果A换成B是不划算的那么可以将A和B都换成C,肯定是划算的= = 然后就是简单DP了. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include <

uva 11400 Problem F Lighting System Design

紫皮书题: 题意:让你设计照明系统,给你n种灯泡,每种灯泡有所需电压,电源,每个灯泡的费用,以及每个灯泡所需的数量.每种灯泡所需的电源都是不同的,其中电压大的灯泡可以替换电压小的灯泡,要求求出最小费用 题解:每种电压灯泡要么全换,要么全不换,因为只换部分还要加额外的电源费用,并且换了部分之后费用更少,不如全换 先把灯泡按照电压从小到大排序,这样进行dp时,后面的电压大的如果比电压小的更优的话就可以替换了 设dp[j]为前j个最优了,则dp[i] = min{dp[i],dp[j] + (s[i]

UVa 11400 Lighting System Design

题意: 一共有n种灯泡,不同种类的灯泡必须用不同种电源,但同一种灯泡可以用同一种电源.每种灯泡有四个参数: 电压值V.电源费用K.每个灯泡的费用C.所需该种灯泡的数量L 为了省钱,可以用电压高的灯泡来代替电压低的灯泡.输出最小费用. 分析: 每种电源的灯泡要么不换要么全换,因为只换部分的话,两种类型的电源都要买,不划算. 将电压从小到大排序,s[i]表示前i种灯泡一共需要多少个灯泡,d[i]表示前i种灯泡最少费用. d[i] = min{d[j] + (s[i] - s[j]) * c[i] +

uva 11400 (动态规划起步第四天 线性DP)

题目很简单,LIS变形 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <set> 5 #include <algorithm> 6 7 #define REP(i,N) for (int i = 0;i < (N);i++) 8 #define REP_1(i,N) for (int i = 1;i < (N);i++) 9 #def