關路燈 洛谷p1220

2021-08-04 13:13:59 字數 1518 閱讀 8448

某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。

為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電。他每天都是在天亮時首先關掉自己所處位置的路燈,然後可以向左也可以向右去關燈。開始他以為先算一下左邊路燈的總功率再算一下右邊路燈的總功率,然後選擇先關掉功率大的一邊,再回過頭來關掉另一邊的路燈,而事實並非如此,因為在關的過程中適當地調頭有可能會更省一些。

現在已知老張走的速度為1m/s,每個路燈的位置(是乙個整數,即距路線起點的距離,單位:m)、功率(w),老張關燈所用的時間很短而可以忽略不計。

請你為老張編一程式來安排關燈的順序,使從老張開始關燈時刻算起所有燈消耗電最少(燈關掉後便不再消耗電了)。

輸入格式:

檔案第一行是兩個數字n(0接下來n行,每行兩個資料,表示第1盞到第n盞路燈的位置和功率。

輸出格式:

乙個資料,即最少的功耗(單位:j,1j=1w·s)。

輸入樣例#1:

5 3

2 10

3 20

5 20

6 30

8 10

輸出樣例#1:

270

輸出解釋:

用dp[i][j][0]表示關了[i,j]這個區間的燈,最後關的是第i盞;

f[i][j][1]表示關了[i,j]這個區間的燈,最後關的是第j盞。

sum[i]表示從1到i的燈的總功率。cal(i,j)表示除了[i,j]之外燈的總功率

則有:dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][0]+(p[i+1]-p[i])*cal(i+1,j));

dp[i][j][0]=min(dp[i][j][0],dp[i+1][j][1]+(p[j]-p[i])*cal(i+1,j));

dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][0]+(p[j]-p[i])*cal(i,j-1));

dp[i][j][1]=min(dp[i][j][1],dp[i][j-1][1]+(p[j]-p[j-1])*cal(i,j-1));

#include#include#includeusing namespace std;

struct lighta[55];

int f[2][55][55],w[55][55];

int main()

for(i=1;i<=n;i++)

} f[1][c][c]=f[0][c][c]=0;

for(i=c;i>=1;i--)

} printf("%d\n",min(f[1][1][n],f[0][1][n]));

return 0;

}

洛谷 P1220 關路燈

某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電...

洛谷 P1220 關路燈

某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電...

洛谷 P1220 關路燈

原本想用搜尋先超時一把 然後發現剪枝居然過了 include include include include include include using namespace std int d 10005 記錄燈的功率 int lef,righ,minx int run int x,int y 記錄...