某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小(即同一段時間內消耗的電量有多有少)。老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。
為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電。他每天都是在天亮時首先關掉自己所處位置的路燈,然後可以向左也可以向右去關燈。開始他以為先算一下左邊路燈的總功率再算一下右邊路燈的總功率,然後選擇先關掉功率大的一邊,再回過頭來關掉另一邊的路燈,而事實並非如此,因為在關的過程中適當地調頭有可能會更省一些。
現在已知老張走的速度為1m/s,每個路燈的位置(是乙個整數,即距路線起點的距離,單位:m)、功率(w),老張關燈所用的時間很短而可以忽略不計。
請你為老張編一程式來安排關燈的順序,使從老張開始關燈時刻算起所有燈消耗電最少(燈關掉後便不再消耗電了)。
輸入格式:
檔案第一行是兩個數字n(1<=n<=50,表示路燈的總數)和c(1<=c<=n老張所處位置的路燈號);
接下來n行,每行兩個資料,表示第1盞到第n盞路燈的位置和功率。資料保證路燈位置單調遞增。
輸出格式:
乙個資料,即最少的功耗(單位:j,1j=1w·s)。
輸入樣例#1:複製
5 3輸出樣例#1:複製2 10
3 20
5 20
6 30
8 10
270輸出解釋:
雖然題解都是dp,但是我們可以發現資料很小,我們就直接dfs一下吧,用dfs(int num,int id,int time,int rec,int sum)表示
num:現在的座標,id現在在的路燈號,time:已經過的時間,rec:目前的電能消耗,sum:關閉的路燈數
乙個剪枝就是把rec+=(還沒關的路燈*time),判斷會不會大於目前ans,大於就return,會快很多,
如果sum==n就停止搜尋,然後就是分別找id的左邊和右邊,記得回溯就行。。
#include #include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f
#define ll long long
using namespace std;
const int maxn=1e5+10;
int vis[100],n,m,ans=1e9;
struct newt
dian[100];
void dfs(int num,int id,int time,int rec,int sum)
if(t!=0)
}int main()
洛谷 P1220 關路燈(DFS)
題目描述 某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能...
洛谷 題解 P1220 關路燈
搜尋 inline void dfs int now,int l,int r,int cnt,int sum,int k now為當前點 l為左端點 r為右端點 cnt為當前耗電量 sum為開著的燈的總耗電 k為還有幾盞燈開著 if l 1 dfs l 1,l 1,r,cnt m now m l 1...
洛谷 P1220 關路燈
某一村莊在一條路線上安裝了n盞路燈,每盞燈的功率有大有小 即同一段時間內消耗的電量有多有少 老張就住在這條路中間某一路燈旁,他有一項工作就是每天早上天亮時一盞一盞地關掉這些路燈。為了給村里節省電費,老張記錄下了每盞路燈的位置和功率,他每次關燈時也都是盡快地去關,但是老張不知道怎樣去關燈才能夠最節省電...