题目描述
某个国家有N+1个城市,编号从0到N。这个国家的交通比较简单,只有相邻的两个城市才直接有路相连,对于城市i(0≤i<N)来说,城市i与城市i+1之间有一条长度为road[i]的高速公路,还有一条长度为water[i]的水路。现在你需要从城市0到达城市N,最短路径是多少?有个要求,你走的水路不能超过k条(因为害怕海盗)。
输入输出格式
输入格式
第一行,两个整数,N和K。1≤N≤50,0≤k≤N。
第二行,N个整数,空格分开,每个整数的范围是1至1000。第i个整数表示城市i到城市i+1之间的高速公路的长度。注意:i的下标从0开始。
第三行,N个整数,空格分开,每个整数的范围是1至1000。
第i个整数表示城市i到城市i+1之间的水路的长度。注意:i的下标从0开始。
输出格式
一个整数,表示从城市0到达城市N,最短路径是多少?走的水路不能超过k条。
输入输出样例
输入样例
3 1
4 6 7
1 2 3
输出样例
13
说明
样例说明
城市0到城市1走高速公路,长度是4;城市1到城市2走高度公路,长度是6;城市2到城市3走水路,长度是3。因此,最短路径是13。
题解
贪心水题,每次选能相对对应陆路减尽可能多路径的水路走即可。
#include <iostream> #include <algorithm> using namespace std; int n, k; int a[51], b[51]; int main() { cin >> n >> k; for(int i = 1; i <= n; i++) { cin >> a[i]; a[i] += a[i-1]; } for(int i = 1; i <= n; i++) { cin >> b[i]; b[i] -= a[i] - a[i-1]; } sort(b+1,b+1+n); for(int i = 1; i <= k; i++) { if(b[i] > 0) break; a[n] += b[i]; } return cout << a[n], 0; }