百度空间 | 百度首页 
 
查看文章
 
关路灯(N=1000动规版)
2008年11月10日 星期一 下午 08:46
【问题描述】
  多瑞卡得到了一份有趣而高薪的工作。每天早晨他必须关掉他所在村庄的街灯。所有的街灯都被设置在一条直路的同一侧。
  多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯。开始时,他站在某一盏路灯的旁边。
  每盏灯都有一个给定功率的电灯泡,因为多端卡有着自觉的节能意识,他希望在耗能总数最少的情况下将所有的灯关掉。
  多端卡因为太累了,所以只能以1m/s的速度行走。关灯不需要花费额外的时间,因为当他通过时就能将灯关掉。
  编写程序,计算在给定路灯设置,灯泡功率以及多端卡的起始位置的情况下关掉所有的灯需耗费的最小能量。
【输入格式】
  输入文件的第一行包含一个整数N,2≤N≤1000,表示该村庄路灯的数量。
  第二行包含一个整数V,1≤V≤N,表示多瑞卡开始关灯的路灯号码。
  接下来的N行中,每行包含两个用空格隔开的整数D和W,用来描述每盏灯的参数,其中0≤D≤1000,0≤W≤1000。D表示该路灯与村庄开始处的距离(用米为单位来表示),W表示灯泡的功率,即在每秒种该灯泡所消耗的能量数。路灯是按顺序给定的。
【输出格式】
  输出文件的第一行即唯一的一行应包含一个整数,即消耗能量之和的最小值。注意结果小超过1,000,000,000。
【输入样例】
4
3
2 2
5 8
6 1
8 7
【输出样例】
56
program fdfd;
var n,v,i,j,a,b,min,c:longint;
    d,w,sw:array[0..1000] of longint;
    f,val:array[0..1000,0..1000] of longint;
begin
assign(input,'power.in');assign(output,'power.out');
reset(input); rewrite(output);
readln(n);
readln(v);
sw[0]:=0;
for i:=1 to n do
begin
readln(d[i],w[i]);
sw[i]:=sw[i-1]+w[i];
end;
fillchar(val,sizeof(val),0) ;
for i:=1 to n do
for j:=i to n do
val[i,j]:=val[i,j-1]+w[j];
for i:=1 to n do
for j:=i to n do
val[j,i]:=val[i,j];
fillchar(f,sizeof(f),$7f);
f[0,v]:=0;
for i:=1 to n-1 do
for j:=1 to n do
if j<>v then
begin
   if j<v then begin a:=j+1; b:=i+j; end;
   if j>v then begin a:=j-1; b:=j-i; end;
   c:=maxlongint;
   if (a<=n)and(a>=1) then
   if f[i-1,a]<1000000000 then
   c:=f[i-1,a]+(sw[n]-val[j,b]+w[j])*abs(d[a]-d[j]);
   if (b<=n)and(b>=1) then
   if f[i-1,b]<1000000000 then
   if f[i-1,b]+(sw[n]-val[j,b]+w[j])*abs(d[b]-d[j])<c then
   c:=f[i-1,b]+(sw[n]-val[j,b]+w[j])*abs(d[b]-d[j]);
   if c<=1000000000then
   if c<f[i,j] then
   f[i,j]:=c;
end;
min:=maxlongint;
for i:=1 to n do
if f[n-1,i]<min then
min:=f[n-1,i] ;
writeln(min);
close(input); close(output);
end.

类别:题解 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2009年11月08日 星期日 下午 10:16 | 回复
可不可以解释一下你的思路啊
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu