题文:

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

题解:

  又是一道十分巧妙的题目,首先很容易发现对于某种灯泡,要么全换,要么不换。因为如果要换,要么是灯泡比被换的更好,要么是整体更好,所以两种情况显然全部换才更优,才能省下电源钱。其二,对于这个题目,有个非常妙的性质——要换就是换连续的一个区间。因为如果不是一个区间,而是中间有某个灯泡断开了这个区间。就说明中间的使其断开的灯泡比当前更新的灯泡更优,那么为什么不能用断开的灯泡去更新前面的呢?

  所以就有了转移dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*a[i].c+a[i].k);dp[i]表示前i个的最小花费,就是说j之前用最优方案,j之后都用i号灯泡来更新。的确,贪心加dp,十分巧妙。

代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<stdlib.h>
#define ll long long
#define MAXN 1010
using namespace std;
struct light{
int v,k,c,l;
}a[MAXN]; bool cmp(light x,light y){
return x.v<y.v;
} int dp[MAXN],sum[MAXN];
int main(){
while(){
int n;scanf("%d",&n);
if(!n) break;
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++){
cin>>a[i].v>>a[i].k>>a[i].c>>a[i].l;
}
dp[]=;
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++) sum[i]=sum[i-]+a[i].l;
for(int i=;i<=n;i++){
for(int j=i-;j>=;j--){
dp[i]=min(dp[i],dp[j]+(sum[i]-sum[j])*a[i].c+a[i].k);
}
}
printf("%d\n",dp[n]);
}
}

最新文章

  1. JavaScript获取时间戳、日期格式化
  2. ECMAScript 5
  3. SQLLocalDB 11.0持续报错,这是泥马德什么问题啊!!!
  4. go文件操作大全
  5. IOS内存管理「4」- ARC 和垃圾回收机制的基本概念
  6. 转: app端数据库(性能高) realm (ios, android 均支持)
  7. eclipse中使用jython
  8. nodejs报错 events.js:72 throw er; // Unhandled &#39;error&#39; event
  9. nginx配置限制同一个ip的访问频率
  10. js中的伪数组
  11. LeetCode(53)-Binary Tree Paths
  12. forwardport--源码笔记--注释
  13. 【python】使用flask制作小型页面的关键点总结
  14. nginx普通配置/负载均衡配置/ssl/https配置
  15. JavaScript对象类型之简单介绍
  16. session,cookie,sessionStorage,localStorage的区别
  17. BZOJ 1195: [HNOI2006]最短母串
  18. Burp Suite之截断代理功能及相关设置(一)
  19. Java编译报错:意外的类型
  20. gulp 使用入门

热门文章

  1. 详细的漏洞复现:Shellshock CVE-2014-6271 CVE-2014-7169
  2. Nginx使用GeoIP模块来限制地区访问
  3. Linux基础_网站权限规划
  4. 【LeetCode】DFS 总结
  5. Python数据库小程序
  6. jumper-server-部署官网版
  7. Swoole入门到实战 打造高性能 赛事直播平台(完整版)
  8. 【JVM学习】2.Java虚拟机运行时数据区
  9. AtCoder从小白到大神的进阶攻略
  10. .Net WCF服务部署IIS详细解析