第五十一题 UVA11400 照明系统设计 Lighting System Design

首先要说明的是,为求得最小花费,对于某种灯泡,要么全换,要么全不换

这个问题难就难在如何找子问题。如果先按灯泡电压把灯泡从小到大进行排序,定义dp[i]为替换第i种灯泡后前i种灯泡的最小花费,因为对一种替换情况,不知道用来替换的灯泡后来会不会再用,如果不用相当于不替换的情况下多用了一个电源,这样不一定会达到最优,所以这样定义不行。这样当前的决策会影响到后面的决策。对于这种情况,我们应该对决策进行一定的限制: 求前i个灯泡的最小花费时,只允许用第i种灯泡进行替换! 如何替换呢? 只能替换1 到i 中序号连续的灯泡!!! 即决策应为选择一个j,替换掉序号为 j 到i - 1的所有灯泡,使得前i号灯泡花费最小。那么最终 dp[n]即为答案。即d[i]为只考虑前i种灯泡的最小花费,状态转移方程:d[i] = min{d[i] + (s[i] - s[j]) * c[i] + k[i]} 其中s[i]为前i种灯泡的总数量。

You are given the task to design a lighting system for a huge conference hall. After doing a lot of
calculation and sketching, you have figured out the requirements for an energy-efficient design that
can properly illuminate the entire hall. According to your design, you need lamps of n different power
ratings. For some strange current regulation method, all the lamps need to be fed with the same
amount of current. So, each category of lamp has a corresponding voltage rating. Now, you know the
number of lamps and cost of every single unit of lamp for each category. But the problem is, you are
to buy equivalent voltage sources for all the lamp categories. You can buy a single voltage source for
each category (Each source is capable of supplying to infinite number of lamps of its voltage rating.)
and complete the design. But the accounts section of your company soon figures out that they might
be able to reduce the total system cost by eliminating some of the voltage sources and replacing the
lamps of that category with higher rating lamps. Certainly you can never replace a lamp by a lower
rating lamp as some portion of the hall might not be illuminated then. You are more concerned about
money-saving than energy-saving. Find the minimum possible cost to design the system.
Input
Each case in the input begins with n (1 ≤ n ≤ 1000), denoting the number of categories. Each of the
following n lines describes a category. A category is described by 4 integers - V (1 ≤ V ≤ 132000), the
voltage rating, K (1 ≤ K ≤ 1000), the cost of a voltage source of this rating, C (1 ≤ C ≤ 10), the cost
of a lamp of this rating and L (1 ≤ L ≤ 100), the number of lamps required in this category. The input
terminates with a test case where n = 0. This case should not be processed.
Output
For each test case, print the minimum possible cost to design the system.
Sample Input
3
100 500 10 20
120 600 8 16
220 400 7 18
0
Sample Output
778

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define Maxn 1010
using namespace std;
struct Node {
	int v,c,l,k;
	bool operator < (const Node &a ) const {
		return v < a.v;
	}
}p[Maxn];
int sum[Maxn],dp[Maxn],n;
int main(int argc,char* argv[]) {
	while(scanf("%d",&n) == 1 && n) {
		for(int i=1; i<=n; i++)
			scanf("%d%d%d%d",&p[i].v,&p[i].k,&p[i].c,&p[i].l);
		sort(p + 1, p + n + 1);
		for(int i=1; i<=n; i++)
			sum[i] = sum[i - 1] + p[i].l;
		for(int i=1; i<=n; i++) {
			dp[i] = sum[i] * p[i].c + p[i].k;
			for(int j=1; j<i; j++)
				dp[i] = min(dp[i],dp[j] + (sum[i] - sum[j]) * p[i].c + p[i].k);
		}
		printf("%d\n",dp[n]);
	}
	
	return 0;
}
发布了732 篇原创文章 · 获赞 31 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_35776409/article/details/104029092
今日推荐