题目链接:

https://codeforces.com/problemset/problem/1249/E

题目大意:

有 n 层楼,告诉你从 i 到 i + 1 的楼层 走楼梯 的时间以及 坐电梯 的时间,做电梯需要等待 c 时间,求解从 1 楼到每一层的最短时间

思路:

构建 dp 方程,dp[i][j],i 表示楼层,j 为 0 或 1,0 为走楼梯的时间,1 为坐电梯的时间。结束了...

代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2e5 + 10;
    int n, c, dp[N][2];
    vector <int> a(N), b(N);
    int main(){
    	cin >> n >> c;
    	dp[1][0] = 0, dp[1][1] = c;  //在一楼坐电梯的话,时间为 c
    	for (int i = 2; i <= n; i++)
    		scanf("%d", &a[i]);
    	for (int i = 2; i <= n; i++)
    		scanf("%d", &b[i]);
    	for (int i = 2; i <= n; i++){
    		dp[i][0] = dp[i - 1][0] + a[i];
    		dp[i][0] = min(dp[i - 1][1] + a[i], dp[i][0]);  //走楼梯的最短时间为之前一层走楼梯和坐电梯的最小时间
    		dp[i][1] = dp[i - 1][0] + b[i] + c;  //之前是走楼梯的话,现在做电梯需要等待
    		if (i != 2) dp[i][1] = min(dp[i - 1][1] + b[i], dp[i][1]);  //之前就是做电梯的话,不需要等待
    	}
    	for (int i = 1; i <= n; i++)
    		cout << min(dp[i][0], dp[i][1]) << " \n"[i == n];
    	return 0;
    }
posted on 2021-11-18 11:45  Hamine  阅读(40)  评论(0编辑  收藏  举报