nyoj304 節能

來源:互聯網
上載者:User

標籤:

節能時間限制:1000 ms  |  記憶體限制:65535 KB難度:5
描述

Dr.Kong設計的機器人卡多越來越聰明。最近市政公司交給卡多一項任務,每天早晨5:00開始,它負責關掉ZK大道右側上所有的路燈。

卡多每到早晨5:00準會在ZK大道上某盞路燈的旁邊,然後他開始關燈。每盞燈都有一定的功率,機器人卡多有著自覺的節能意識,它希望在關燈期間,ZK大道右側上所有路燈的耗電量總數是最少的。

機器人卡多以1m/s的速度行走。假設關燈動作不需要花費額外的時間,因為當它通過某盞路燈時就順手將燈關掉。

請你編寫程式,計算在給定路燈設定,燈泡功率以及機器人卡多的起始位置的情況下,卡多關燈期間,ZK大道上所有燈耗費的最小能量。

輸入
有多組測試資料,以EOF為輸入結束的標誌
每組測試資料第一行: N 表示ZK大道右側路燈的數量 (2≤ N ≤ 1000)
第二行: V 表示機器人卡多開始關燈的路燈號碼。 (1≤V≤N)
接下來的N行中,每行包含兩個用空格隔開的整數D和W,用來描述每盞燈的參數

D表示該路燈與ZK大道起點的距離 (用米為單位來表示),
W表示燈泡的功率,即每秒該燈泡所消耗的能量數。路燈是按順序給定的。
( 0≤D≤1000, 0≤W≤1000 )
輸出
輸出一個整數,即消耗能量之和的最小值。注意結果小於200,000,000
範例輸入
4 32 25 86 18 7
範例輸出
56
來源
第四屆河南省程式設計大賽

解題思路:

本題是一道Dynamic Programming的題目,機器人關燈要麼是去左邊關燈,或者是去右邊關燈,也即要關閉的下一個路燈要麼是從已關閉路段的左端過去的,要麼是從已關閉的路段的右端過去的,定義:

DP[i][j][0]表示i到j的路燈都已經關閉,機器人在路燈i的位置,此時已經消耗的最小電能

DP[i][j][1]表示i到j的路燈都已經關閉,機器人在路燈j的位置,此時已經消耗的最小電能

則狀態轉移式:

DP[i][j][0] = min(DP[i+1][j][0]+[i+1,j]路段以外未關閉路燈在機器人從i+1走的i期間消耗的電能,DP[i+1][j][1]+[i+1,j]路段以外未關閉路燈在機器人從j走到i期間消耗的電能)

DP[i][j][1] = min(DP[i][j-1][0]+[i,j-1]路段以外未關閉路燈在機器人從i走到j期間消耗的電能,DP[i][j-1][1]+[i,j-1]路段以外未關閉路燈在機器人從j-1走到j期間消耗的電能)


AC代碼:

 1 #include<algorithm> 2 #include<cstdio> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 const int N = 1010; 7 int dp[N][N][2],dw[N][N],st[N],co[N]; 8 int main() 9 {10     int n,s,v,sum;11     while(scanf("%d",&n)!=EOF)12     {13         memset(dw,0,sizeof(dw));14         sum = 0;15         scanf("%d",&v);16         for(int i =1; i<=n; i++)17         {18             scanf("%d %d",&st[i],&co[i]);19             sum =sum+co[i];20         }21         for(int i=1;i<=n;i++)22             for(int j=i;j<=n;j++)23               dw[i][j] = dw[i][j-1]+co[j];24         for(int i = v-1; i>0; i--)25         {26             dp[i][v][0] = dp[i+1][v][0]+(sum-dw[i+1][v])*(st[i+1]-st[i]);27             dp[i][v][1] = dp[i][v][0] +(sum-dw[i][v])*(st[v]-st[i]);28         }29         for(int j =v+1; j<=n; j++)30         {31             dp[v][j][1] =dp[v][j-1][1]+(sum-dw[v][j-1])*(st[j]-st[j-1]);32             dp[v][j][0] =dp[v][j][1]+(sum-dw[v][j])*(st[j]-st[v]);33         }34 35         for(int i =v-1;i>0;i--)36         {37             for(int j =v+1; j<=n; j++)38             {39                 dp[i][j][0] = min(dp[i+1][j][0]+(sum-dw[i+1][j])*(st[i+1]-st[i]),40                                   dp[i+1][j][1]+(sum-dw[i+1][j])*(st[j]-st[i]));41                 dp[i][j][1] = min(dp[i][j-1][0]+(sum-dw[i][j-1])*(st[j]-st[i]),42                                   dp[i][j-1][1]+(sum-dw[i][j-1])*(st[j]-st[j-1]));43             }44         }45 46         printf("%d\n", min(dp[1][n][0], dp[1][n][1]));47     }48     return 0;49 }

 

nyoj304 節能

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.