[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)的灯,则一定要先 ...
随机推荐
- 【原】.Net之美学习笔记-第1章-1.1.1值类型
结构还有一个特性:调用结构上的方法前,需要对其所有的字段进行赋值.
- DBA
一个公司的数据库系统也是由DBA 来进行管理的,它们的主要工作如下: l 安装和配置数据库,创建数据库以及帐户:l 监视数据库系统,保证数据库不宕机:l 收集系统统计和性能信息以便进行调整:l 发现性 ...
- django引用static目录下的css,js文件304问题
前提:django1.8 在html页面可以请求道css,js文件并在chrome的开发者工具中查看css,js文件返回状态为200 原因: html页面在头部添加了<!DOCTYPE html ...
- Extension method for type
扩展其实真的很简单 msdn是这样规定扩展方法的:"扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为 ...
- nuget的使用总结
使用NuGet发布自己的类库包(Library Package) from:http://blog.csdn.net/gulijiang2008/article/details/41724927 使用 ...
- Python SqlAlchemy使用方法
1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create ...
- 关于LookAt
Transform.LookAt 注视 function LookAt (target : Transform, worldUp : Vector3 = Vector3.up) : void 旋转物体 ...
- The partner transaction manager has disabled its support for remote/network transactions.
http://technet.microsoft.com/en-us/library/cc753510(WS.10).aspx
- hdu 1560 DNA sequence(搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=1560 DNA sequence Time Limit: 15000/5000 MS (Java/Others) ...
- scrollview始终显示滚动条 Android
设置scrollview的:android:fadeScrollbars="false"表示始终显示垂直滚动条