[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)的灯,则一定要先 ...
随机推荐
- python BeautifulSoup find 方法
这里我们重点讲一下find的几种用法,其他的类比: find(name=None, attrs={}, recursive=True, text=None, **kwargs) (ps:只讲几种用法, ...
- python引入导入自定义模块和外部文件
参考:http://blog.csdn.net/devil_2009/article/details/15816237 项目中想使用以前的代码,或者什么样的需求致使你需要导入外部的包 如果是web 下 ...
- C# 目录与文件管理
文件读写 学习了一点点希望对以后的学习工作有帮助 在应用程序中基本任务是对数据的操作,这就是对数据进行访问和保存挤兑数据的读写,应用程序访问一个文本文件叫做“读”:对文本文件的内容进行修改后保存这些修 ...
- 创建第一个UI
创建一个2D UI 制作UI时,首先要创建UI的"根".在Unity顶部NGUI菜单中选择Create,然后选择2D UI. 创建完成后,在Scene窗口中,NGUI自动生成了一个 ...
- 洛谷 P1417 烹调方案
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 我的PHP之旅--数组的认识(初级)
数组 PHP的数组与swift有些许不同,分为3类(初级,以后会涉及到多维数组和数组指针等). 枚举数组 关联数组 混合数组 枚举数组 枚举数组跟swift中的数组差不多: <?php $arr ...
- IIS Handler and Module探索
Create Handler & Module Run the Visual Studio Create a Class Library “HMHandler” --> Change t ...
- Java连接MySQl数据库实现代码
1. 获取数据库连接和查询代码 package connectionmysql; import java.sql.Connection; import java.sql.DriverManager; ...
- oracle删除表的方法
1. 删除oracle表中的所有数据而不删除表: 语法: TRUNCATE TABLE table_name; 使用这条语句只是删除表中的全部数据,不是删除表,这种方式也叫做截断表,这种方式比使用de ...
- 年度十佳 DevOps 博客文章(后篇)
如果说 15 年你还没有将 DevOps 真正应用起来,16 年再不实践也未免太落伍了.在上篇文章中我们了解到 15 年十佳 DevOps 博客文章的第 6-10 名,有没有哪一篇抓住了您的眼球,让您 ...