[CODEVS1258]关路灯
题目描述 Description
多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。
多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。
每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。
多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。
编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。
输入描述 Input Description
输入文件的第一行包含一个整数N,2≤N≤1000,表示该村庄路灯的数量。
第二行包含一个整数V,1≤V≤N,表示多瑞卡开始关灯的路灯号码。
接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数,其中0≤D≤1000,0≤W≤1000。D表示该路灯与村庄开始处的距离(用米为单位来表示),W表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。
输出描述 Output Description
输出文件的第一行即唯一的一行应包含一个整数,即消耗能量之和的最小值。注意结果小超过1,000,000,000。
样例输入 Sample Input
4
3
2 2
5 8
6 1
8 7
样例输出 Sample Output
56
思路
对于小数据来说,爆搜可以过,n<=50,然而对于大的数据,当n<=1000时,只能过7个点。
设f[i,j,k](k=1或2)表示已经关过的MM区间为[i,j],k=1表示当前在左端点i位置,k=2表示当前在右端点j位置。
- f[i,j,0]=min{ f[i+1,j,1] + (w[i] + (w[n] - w[j]))*(d[i+1] - d[i]),
- f[i+1,j,2] + (w[i]+ (w[n] - w[j]))*(d[i+1] - d[i]) }
- f[i,j,2]=min{ f[i,j-1,1] + (w[i-1] + (w[n] - w[j-1]))*(d[j] - d[i]),
- f[i,j-1,2] + (w[i-1] + (w[n] - w[j-1]))*(d[j] - d[j-1]) }
- 初始状态:f[s,s,1]=s[s,s,2]=0
- 目标状态:min{ f[1,n,1] , f[1,n,2] }
- 时间复杂度:O(n^2)
- DFS
var
n,c,ans,total:longint;
dis,w:array[..]of longint;
f:array[..]of boolean; procedure init;
begin
assign(input,'power.in');
assign(output,'power.out');
reset(input);
rewrite(output);
end; procedure terminate;
begin
close(input); close(output);
halt;
end; procedure dfs(t,tot,total,t1:longint);
var
i:longint;
begin
for i:=t- downto do
if f[i] then
begin
if tot+(dis[t]-dis[i])*(total-w[t])<ans then
begin
f[i]:=false;
dfs(i,tot+(dis[t]-dis[i])*(total-w[t]),total-w[t],t1+);
f[i]:=true;
break;
end;
end;
for i:=t+ to n do
if f[i] then
begin
if tot+(dis[i]-dis[t])*(total-w[t])<ans then
begin
f[i]:=false;
dfs(i,tot+(dis[i]-dis[t])*(total-w[t]),total-w[t],t1+);
f[i]:=true;
break;
end;
end;
if t1=n then
if tot<ans then
begin
ans:=tot;
exit;
end;
end; procedure main;
var
i:longint;
begin
readln(n,c);
total:=;
for i:= to n do
begin
readln(dis[i],w[i]);
f[i]:=true;
total:=total+w[i];
end;
ans:=maxlongint;
f[c]:=false;
dfs(c,,total,);
writeln(ans);
end; begin
init;
main;
terminate;
end.
DP
program CloseTheLight;
uses math;
var n,c,i,p,j,k,v1,a:longint;
v,s:array[..] of longint;
f:array[..,..,..] of longint;
begin
read(n,c);
for i:= to n do
begin
read(v[i],a);
s[i]:=s[i-]+a;
end;
filldword(f,sizeof(f) div ,maxlongint);
f[c,c,]:=;
f[c,c,]:=;
for p:= to n- do
for i:= to n-p do
begin
j:=i+p;
for k:= to do
begin
if k= then v1:=i else v1:=j;
if f[i,j,k]<maxlongint then
begin
if i> then f[i-,j,]:=min(f[i-,j,],
f[i,j,k]+(s[i-]+s[n]-s[j])*(v[v1]-v[i-]));
if j<n then f[i,j+,]:=min(f[i,j+,],
f[i,j,k]+(s[i-]+s[n]-s[j])*(v[j+]-v[v1]));
end;
end;
end;
writeln(min(f[,n,],f[,n,]));
end.
[CODEVS1258]关路灯的更多相关文章
- codevs1258关路灯
传送门 1258 关路灯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他 ...
- codevs1258 关路灯(☆区间dp)
1258 关路灯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须 ...
- 洛谷P1220 关路灯
洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...
- Luogu 1220 关路灯(动态规划)
Luogu 1220 关路灯(动态规划) Description 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项 ...
- 109.关路灯(区间dp)
1258 关路灯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每 ...
- 洛谷P1220 关路灯(区间dp)
关路灯 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯.为了给村里节 ...
- 洛谷——P1220 关路灯
P1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉 ...
- 「LuoguP1220」 关路灯(区间dp
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 【洛谷P1220】关路灯
题目有点难描述,内容请直接看原题.. 题解: 可以发现人在关路灯时无论走什么样的路径,从宏观上来看被关的灯总是构成一段包含初始点的连续区间.比如要关掉下标为 l (l < st)的灯,则一定要先 ...
随机推荐
- HTML5元素拖拽实现示例
HTML5现在前端圈中,已然成为一个不那么新的技术词汇了,很多公司也把HTML5也当成了硬性的技能要求,但是很多前端恐怕都不了解HTML5的拖拽怎么实现吧. 看了下极客学院的视频,大概的了解了下思路. ...
- linux点滴:NFS
介绍 NFS,Network File System,网络文件系统.主要功能是通过网络让不同的主机系统间共享资源,类似于windows下的文件共享.适用于互联网中小型企业. 工作原理 客户端发送请求 ...
- wpf image控件循环显示图片 以达到动画效果 问题及解决方案
1>最初方案: 用wpf的image控件循环显示图片,达到动画效果,其实就是在后台代码动态改变Image.Source的值,关键代码: ; i < ; i++)//六百张图片 { Bitm ...
- uCGUI字符串显示过程分析和uCGUI字库的组建
为什么要分析字符串的显示过程? 学习uCGUI主要是学习如何使用的,为何要深究到源码的层次呢? 就分析字符串显示过程的原因来说,是因为移植汉字字库的需要.uCGUI并么有合适的汉字字库,而且完整的汉字 ...
- 刷漆(Codechef October Challenge 2014:Remy paints the fence)
[问题描述] Czy做完了所有的回答出了所有的询问,结果是,他因为脑力消耗过大而变得更虚了:).帮助Czy恢复身材的艰巨任务落到了你的肩上. 正巧,你的花园里有一个由N块排成一条直线的木板组成的栅栏, ...
- python 中参数*args, **kwargs
def func(*args, **kwargs): print 'args : ', args print 'kwargs :', kwargs def test(): func(1,2,'x',' ...
- CHANGE DEFAULT FTP PORT FOR VSFTP
http://twincreations.co.uk/change-default-ftp-port-for-vsftp/ http://www.cnblogs.com/kuliuheng/p/320 ...
- android Failure [INSTALL_FAILED_OLDER_SDK] 安装apk失败
安装文件与运行环境的skd不匹配 打开源码目录下的AndroidManifest.xml文件,然后注释掉或者删除掉这行: <uses-sdk android:minSdkVersion=&quo ...
- ANDROID_MARS学习笔记_S01原始版_001_Intent
一.Intent简介 二.代码 1.activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.co ...
- 转载爱哥自定义View系列--文字详解
FontMetrics FontMetrics意为字体测量,这么一说大家是不是瞬间感受到了这玩意的重要性?那这东西有什么用呢?我们通过源码追踪进去可以看到FontMetrics其实是Paint的一个内 ...