洛谷 P1220 關路燈

2022-03-17 18:03:15 字數 1943 閱讀 8506

題目:關路燈

**:題目描述

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

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

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

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

輸入格式

第一行是兩個數字 n(表示路燈的總數)和 c(老張所處位置的路燈號);

接下來 n 行,每行兩個資料,表示第 1 盞到第 n 盞路燈的位置和功率。資料保證路燈位置單調遞增

輸出格式

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

輸入輸出樣例

輸入

5 3

2 10

3 20

5 20

6 30

8 10

輸出
270
說明/提示

樣例解釋

此時關燈順序為** 3 4 2 1 5 **。

資料範圍

1≤n≤50, 1≤c≤n。

明確一點:老張關的路燈號一定是連續的(也就是說,不會存在「三過路燈不顧」的情況);證明顯然。

我們來定義狀態:對於老張,我們先確定當前處於的路燈位置,記作dp[pos],這樣會有顯式的問題,因為dp[pos]是從哪個狀態轉移得到的,不知道!因此,我們還需要確定已經處理過的路燈的範圍[l, r],於是我們可以定義狀態:dp[l, r, pos];不過留意一點,pos指的是當前正關的路燈號,由此可得對於已操作完成的區間[l, r](包含當前位置),pos = l 或 r。

所以,pos這一維是冗餘的,取而代之的是用0/1來表示當前處於位置的左右(1表示在r + 1處,0表示在l - 1處);而所算的代價恰恰是剩餘燈泡的電功率乘以此次移動的時間。

有方程:

dp[i, j, 0] = min + sum), dp[i + 1, j, 1] + (pos[j] - pos[i]) * (sum + sum)}

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

**如下:

#include#include#include#includeusing namespace std;

const int maxn = 50 + 1;

int n, c, p[maxn], loc[maxn], sum_front[maxn] = {}, sum_back[maxn] = {};

int dp[maxn][maxn][2];

int main()

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

for(int i = n; i > 0; -- i)

memset(dp, 0x3f, sizeof(dp));

dp[c][c][0] = dp[c][c][1] = 0;

for(int k = 2; k <= n; ++ k) }

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

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 記錄...