当前位置: 首页 > 编程日记 > 正文

Uva 11400 - Lighting System Design (DP)

题目链接 https://cn.vjudge.net/problem/UVA-11400

【题意】

你的任务是设计一个照明系统,一共有n(n<=1000)个灯泡可以选择,不同种类的灯必须使用不同的电源,但同种灯泡可以共用一个电源,每种灯泡有4个属性,电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和每种灯泡的数量L(L<=100)

为了省钱,你可以把一些低电压灯泡换成电压更高的灯泡,你的任务是计算出最优方案的费用是多少。

【输入格式】

第一行为一个整数n,表示有n中不同的灯泡,n=0代表输入结束。下面n行每行4个整数,分别是每种灯泡的电压,电源费用,单价和数量。

【输出格式】

输出一个整数即最小费用。

【样例输入】

3

100 500 10 20

120 600 8 16

220 400 7 18

0

【样例输出】

778

【思路】

这道题有两个最绕的地方。我先说结论再证明,第一个是对于某种灯泡来说,要么干脆全不换,要么干脆全都换成更高电压的一种灯泡。第二个是如果我们按照电压升序的规则对每种灯泡排序,那么一定是把连续的一段对应的灯泡换掉才能产生最优解,举个例子说,假如有若干种灯泡已经按照电压排好顺序,那么用第四种灯泡替换掉第一种和第三种一定不是最优解,用第四种把前三种全换掉一定更优!

证明如下。先说第一条,直观理解,如果说现在有两种灯泡,第一种的电压小于第二种。假设把第一种的若干个(不是全部)用第二种替换是最优解,那么也就说明第二种的单价一定小于第一种的,所以才能更省钱,那既然这样,直接全部把第一种换完,连第一种的电源都不用买不是更好么?所以原则是要么全换,要么全不换。当然我开始是拿数学式子推的,设两种灯泡k1,c1,l1;k2,c2,l2然后设用x件第二种灯泡换掉第一种,求花费的表达式

w=k1+k2+c1*l1+c2*l2+(c2-c1)*x(x<l1)

=k2+c2*l1+c2*l2(x==l1)

上式-下式=k1+(c1-c2)(l1-x),所以当c1>=c2时,上式>=下式,也就是说一定要拿单价小的灯泡把单价大的灯泡换掉

对于第二条,想明白了这一点是dp的关键。就拿刚才的例子来说,假如有若干种灯泡已经按照电压排好顺序,假如用第四种灯泡替换掉第一种和第三种是最优解,那么第二种灯泡的单价一定小于第一种灯泡的单价(不然就不是最优了,应该直接那第四种把第二种也换掉才对呀),而如果说第二种灯泡的单价小于第一种灯泡,那么再拿第二种灯泡换掉第一种灯泡就可以产生一个更优解,与假设矛盾,所以也就证明了第二条结论。

设dp[i]是购买前i种灯泡的最小花费,则递推公式为dp[i]=min{dp[j]+(s[i]-s[j])*a[i].c+a[i].k|0<=j<i}dp[0]=0 s[i]指前i中灯泡的总需求量。

#include<bits/stdc++.h>
using namespace std;const int inf=2e9;
const int maxn=1050;struct node{int v,k,c,L;node(int vv=0,int kk=0,int cc=0,int LL=0):v(vv),k(kk),c(cc),L(LL){}bool operator<(const node& e)const{return v<e.v;}
};int n;
node light[maxn];
int dp[maxn],s[maxn];int main(){cin.tie(0);ios_base::sync_with_stdio(0);while(cin>>n && n){memset(s,0,sizeof(s));for(int i=0;i<n;++i){int v,k,c,L;cin>>v>>k>>c>>L;light[i]=node(v,k,c,L);}sort(light,light+n);s[0]=light[0].L;for(int i=1;i<n;++i){s[i]=s[i-1]+light[i].L;}fill(dp,dp+n,inf);dp[0]=light[0].k+light[0].c*light[0].L;for(int i=1;i<n;++i){dp[i]=min(dp[i],s[i]*light[i].c+light[i].k);for(int j=0;j<i;++j){dp[i]=min(dp[i],dp[j]+(s[i]-s[j])*light[i].c+light[i].k);}}cout<<dp[n-1]<<endl;}return 0;
}


转载于:https://www.cnblogs.com/wafish/p/10465464.html

相关文章:

删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录...

delete from people where rowid in (select min(rowid) from people group by peopleId having count(peopleId )>1)转载于:https://www.cnblogs.com/macT/p/10865224.html

微信表白墙 微信小程序 吐槽墙 表白墙 java 开发

目录 1 小程序展示 2 后台展示 3 技术栈 4 代码目录 5 第一版微信表白墙链接 1 小程序展示 2 后台展示 3 技术栈 java:Springboot mybatis mysql mpvue bootstrap dataTable echars 4 代码目录 5 第一版微信表白墙链接 https://blog.csdn.net/huyande123/article/det…

Sql存储过程加密和解密

可用于加密SQL存储过程或者触发器&#xff08;这是SQL Server本身提供的&#xff0c;也就是说这是微软的加密算法&#xff09; http://www.mscto.com 使用 WITH ENCRYPTION 选项 WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程&#xff0c;使用 sp_helptext …

C++向量类模板(支持实数向量与复数向量的各种运算)

2019独角兽企业重金招聘Python工程师标准>>> 头文件&#xff1a; /** Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry163.com** This program is free software; you can redistribute it and/or modify it* under the terms of the GNU General Public L…

C# 篇基础知识11——泛型和集合

.NET提供了一级功能强大的集合类&#xff0c;实现了多种不同类型的集合&#xff0c;可以根据实际用途选择恰当的集合类型。 除了数组 Array 类定义在System 命名空间中外&#xff0c;其他的集合类都定义在System.Collections 命名空间中。为了方便、快捷地操纵集合元素&#xf…

React和vue的差异和相似地方

React 单向绑定&#xff08;加插件后&#xff0c;还是可以双向绑定&#xff09; Vue 双向绑定 组件化 1、 React&#xff0c;需要编写render函数&#xff0c; 2、 当React状态的状态state改变是render就会重新被调用&#xff0c; 重新计算全dom&#xff0c;然后对旧的dom就行对…

正则表达式相关方法

1 判断字符串中是否包含字母 /** * 使用正则表达式来判断字符串中是否包含字母 * param str 待检验的字符串 * return 返回是否包含 * true: 包含字母 ;false 不包含字母*/ public boolean judgeContainsStr(String str) { String regex".*[a-zA-Z].*"; Match…

Ajax Upload多文件上传插件翻译及中文演示

http://www.zhangxinxu.com/wordpress/?p342转载于:https://www.cnblogs.com/qiantuwuliang/archive/2010/03/19/1689800.html

[每日一讲] Python系列:Python概述

Python 序章 概述 Python 是弱类型动态解释型的面向对象高级语言&#xff0c;其具备面向对象的三大特点&#xff1a;封装、继承、多态。Python 代码运行时&#xff0c;其有一个编译过程&#xff0c;通过编译器生成 .pyc 字节码 文件&#xff08;为二进制文件&#xff09;&#…

微信公众号开发 微信消息回复开发 文本消息 图片消息开发

开发语言&#xff1a;java 实现功能&#xff1a;发送文字回复文字&#xff0c;发送图片回复图片、token验证、获取access_token等相关功能。 如图&#xff1a; 微信后台接口配置 &#xff0c;此为测试账号&#xff0c;正式设置也是一样的 项目地址&#xff1a;https://github…

[置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解

8题只做出4题比较easy的题&#xff0c;而且做得挺麻烦&#xff0c;看来还要多练练。 AC的题如下 NEUOJ 1112 I Love Apple DescriptionSo many people love apple and there is a problem about apple.An Apple Word is a word that consists of only the letters A, P, L, an…

生成唯一序列号

写一个存储过程来实现&#xff1a; 转载于:https://www.cnblogs.com/hwgok/p/8136750.html

如何改变一个地图的Zoom单位

mapControl1.Map.Zoom new MapInfo.Geometry.Distance(mapControl1.Map.Zoom.value,MapInfo.Geometry.DistanceUnit.Kilometer);也可以分开写成如下格式&#xff1a;MapInfo.Geometry.Distance d new MapInfo.Geometry.Distance(1000, DistanceUnit.Kilometer);mapControl1.M…

canvas上的像素操作(图像复制,细调)

canvas上的像素操作(图像复制&#xff0c;细调) 总结 1、操作对象&#xff1a;ImageData 对象&#xff0c;其实是canvas的像素点集合 2、主要操作&#xff1a; var objctx.getImageData(0,0,100,100); ctx.putImageData(obj,110,0) 3、操作图片要放在站点才能正常操作&#xf…

sql查询返回xml数据之应用【转载】

sql查询返回xml数据之应用【转载】 今天查看邮件&#xff0c;看到一标题Using the FOR XML Clause to Return Query Results as XML&#xff0c;点进去看了看&#xff0c;以前也是知道sql server 查询可以返回xml格式&#xff0c;但具体一到应用中比较少&#xff0c;读过文章后…

solr 实现对经纬度的查询

1、solr版本 solr7 2、solr 经纬度查询的方式 使用LatLonType(用于平面坐标&#xff0c;而不是大地坐标&#xff09;SpatialRecursivePrefixTreeFieldType&#xff08;缩写为RPT&#xff09;BBoxField&#xff08;用于边界索引查询&#xff09;2.1 使用 LatLonPointSpatialF…

win7关于IIS发布网站时候数据库的问题,xp也一样

Win7装iis极其简单. 添加ASP.NET网站时应该选择添加"添加应用程序" 如果要连接sql server会报错,说是 "无法打开登录所请求的数据库 "MarketDept"。登录失败。用户 IIS APPPOOL\DefaultAppPool 登录失败。" 而系统中根本不会存在这个用户的. 解决…

Linq 等式运算符:SequenceEqual

检查元素的数量&#xff0c;每个元素的值及两个集合中元素的顺序是否相等,3个方面都相等则为true,否则为false IList<string> strList1 new List<string>(){"One", "Two", "Three", "Four", "Three"};IList<…

Swing 实现聊天系统 私发与群发

该系统使用的了socket、swing相关知识&#xff0c;实现了一个简单的群聊和私聊的系统。 1、程序界面功能展示 服务端swing界面展示 客户端服务展示 用户上线与发送消息客户端与服务端 私发消息 相关代码&#xff1a; package frame;import java.awt.BorderLayout; import ja…

Http和Socket连接区别(ZT)

1、TCP连接 要想明白Socket连接&#xff0c;先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议&#xff0c;可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口&#xff0c;使上层网络数据的传输建立在“无差别”的网络之上。 建立起一…

函数传参涉及到副本的创建与拷贝问题分析

遇到一个问题,是这样的: b [1, 2, 3]def aaa(b):b.append(4)def bbb(b):b 5aaa(b) print(b) # [1, 2, 3, 4]bbb(b) print(b) # [1, 2, 3, 4] 为什么呢,为什么通过函数传参,去修改参数,结果不一致呢? 原因是因为函数传参涉及到了参数副本的创建与拷贝,具体详解: 圆圈2为传参…

网页鼠标滚动实现图片缩放

<SCRIPT LANGUAGE"JavaScript"><!--//图片按比例缩放,可输入参数设定初始大小function resizeimg(ImgD,iwidth,iheight) {var p_w_picpathnew Image();p_w_picpath.srcImgD.src;if(p_w_picpath.width>0 && p_w_picpath.height>0){if(p_w_picp…

Dubbo 2.7.1 踩坑记

Dubbo 2.7 版本增加新特性&#xff0c;新系统开始使用 Dubbo 2.7.1 尝鲜新功能。使用过程中不慎踩到这个版本的 Bug。 系统架构 Spring Boot 2.14-Release Dubbo 2.7.1 现象 Dubbo 服务者启动成功&#xff0c;正常提供服务&#xff0c;消费者调用偶现失败的情况。错误如下图: …

经典算法研究系列:二、Dijkstra 算法初探

经典算法研究系列&#xff1a;二、Dijkstra 算法初探 July 二零一一年一月 本文主要参考&#xff1a;算法导论 第二版、维基百科。 写的不好之处&#xff0c;还望见谅。本经典算法研究系列文章&#xff0c;永久勘误&#xff0c;永久更新、永久维护。 July、二零一一年二月…

[Python Study Notes] Python的安装

Windows&#xff1a; 1.下载安装包&#xff1a; 转到Python官网https://www.python.org/downloads/ &#xff0c;下载最新版本的Python。 2.安装 安装到自定义的安装路径下。 3.配置环境变量 安装完成后--》【右键快捷方式】--》【复制python路径】&#xff0c;例如&#xff1…

swing 实现电影选座系统

该系统使用swing数据库 实现一个电影选座系统&#xff0c;相关系统的截图如下 使用三层架构实现电影购票系统&#xff0c;分用户和管理员&#xff0c;用户功能:展示电影&#xff0c;查找电影(模糊查询)&#xff0c;查看电影详情&#xff0c;查找场次&#xff0c;购买影票&…

JS动态加载JS

1、直接document.write <script language"javascript"> document.write("<script srctest.js><\/script>"); </script> 2、动态改变已有script的src属性 <script src id"s1"></script> <script lang…

PAT乙级1037

1037 在霍格沃茨找零钱 (20 分)如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利…

SAD和SATD的区别[摘]

Q:如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估计中&#xff0c;整象素搜索用SAD&#xff0c;而亚象素用SATD&#xff1f;为什么帧内模式选择要用SATD&#xff1f…

照片换色 使用Python 或者 java

记录使用第三方api 给照片换底色&#xff0c;智能抠图。 1、第三方接口地址 https://www.remove.bg/api 2、抠图效果 3、使用python 实现的代码 在网页换色是不需要进行注册的&#xff0c;如果自己开发 需要注册账号 &#xff0c;得到调取api的口令 import requests impor…