時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
新的宿舍樓有
n(1≤n≤100000)
層and m(1≤m≤100000)
個學生.
在新的宿舍樓裡
, 為了節約學生的時間也為了鼓勵學生鍛鍊身體
, 所以規定該宿舍樓裡的電梯在相鄰的兩層之間是不會連續停下(即,如果在第2層停下就不能在第3層停下。)
.所以,如果有學生在相鄰的兩層之間要停下
, 則其中的一部分學生必須選擇走樓梯來代替。規定:乙個人走下一層樓梯的花費為
a,走上一層樓梯的花費為b。(
1≤a,b≤100
)現在請你設計乙個演算法來計算出所有學生走樓梯花費的最小費用總和。
所有的學生一開始都在第一層,電梯不能往下走,在第二層的時候電梯可以停止。
輸入
輸入有幾組資料t。t(1≤t≤10)
每組資料有n (1≤n≤100000),m(1≤m≤100000),a,b(1≤a,b≤100)。
接下來有m個數字表示每個學生想要停的樓層。
輸出輸出看樣例。
樣例輸入
1樣例輸出3 2 1 1
2 3
case 1: 1
思路:
這其實就是乙個簡單的一維dp,用dp【i】表示從1層上到第 i 層花費的最小的體力。因為不能在相鄰的樓層停留,所以可以從dp【i-2】轉移,但這樣不是最優的還要從dp【i-3】轉移,因為這樣的話就可以到達所有的樓層。我們只要在所有的之間dp最優即可。
其他要注意的乙個條件是,從dp【i-3】轉移時,中間兩層的人有四種選擇:
1:都上去或都下來
2:上面的上去一層,下面的下來一層
3:上面的下來兩層,下面的上去兩層,(當時沒有考慮到這個,要細心啊)
題目講解:題目的狀態轉移方程是比較難想,但是畫一下圖就能發現轉移方程;
下面**now代表當前的樓層:到達每乙個樓層,共有下面四種情況;
存在bug,3 2 1 12 2
時輸出結果為2,保留以後改進我的**:標程:#include #include #include using namespace std;
int main()
memset(dp,0x3f3f3f3f,sizeof(dp));
dp[0]=dp[1]=dp[2]=0;
mi=min(up,down);
for (i=3;i<=n;++i)
}cout <
} return 0;
}
#include #include #include using namespace std;
int dp[100005];
int flo[100005];
int main()
int minn;
for (int i = 3; i <= n; i++)
printf("case %d: %d\n", ++kase, dp[n]);
} return 0;
}
NYOJ 1070詭異的電梯
這道題是個dp,主要考慮兩種情況,剛開始我把狀態轉移方程寫成了dp i min dp i 1 a,dp i 1 b 後來想想當推到dp i 的時候,那個dp i 1 還沒有推出來,所以這種方式推導出來不對,後來又看到dp i min dp i 2 的所有情況最小值,dp i 3 的所有情況值 其中d...
你的電梯,我的電梯,大家的電梯
目錄實時電梯排程演算法 群控電梯排程演算法 參考我們作業的電梯 當電梯們不再相同 結語 每個程式設計師看見電梯,都會想電梯的排程演算法怎麼這麼蠢 先來先服務 fcfs first come first serve 演算法,是一種隨即服務演算法,它不僅僅沒有對尋找樓層進行優化,也沒有實時性的特徵,它是...
小型電梯尺寸 小型電梯尺寸與電梯的分類
別墅安裝小型電梯已經普及,業主可根據家中的大小確定小型電梯的尺寸。小型電梯的尺寸再確定之後,基本上就確定了小型電梯的分類。那就來向大家介紹一下小型電梯尺寸與電梯分類。1.選擇家用電梯時,必須要檢視電梯的配置以及尺寸等。測量人員根據具體的情況確定挑選電梯的型別。2.再安裝家用小型電梯時,必須要提前預留...