JZYZOJ 1279

版权声明:蒟蒻写博客不宜,请随文附上原文链接 https://blog.csdn.net/qq_34493840/article/details/86143785

描述 Description
Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所
有的渡河工具,仅仅是一个木筏。
由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木筏上。在这个基础上,木筏上的奶牛数目每增加1,FJ把木筏划到对岸就得花更多的时间。
当FJ一个人坐在木筏上,他把木筏划到对岸需要M(1 <= M <= 1000)分钟。当木筏搭载的奶牛数目从i-1增加到i时,FJ得多花M_i(1 <= M_i <= 1000)分钟才能把木筏划过河(也就是说,船上有1头奶牛时,FJ得花M+M_1分钟渡河;船上有2头奶牛时,时间就变成M+M_1+M_2分钟。后面的依此类推)。那么,FJ最少要花多少时间,才能把所有奶牛带到对岸呢?当然,这个时间得包括FJ一个人把木筏从对岸划回来接下一批的奶牛的时间。
输入格式 Input Format
第1行: 2个用空格隔开的整数:N 和 M
第2…N+1行: 第i+1为1个整数:M_i
输出格式 Output Format
第1行: 输出1个整数,为FJ把所有奶牛都载过河所需的最少时间
样例输入 Sample Input
5 10
3
4
6
100
1
输入说明:
FJ带了5头奶牛出门。如果是单独把木筏划过河,FJ需要花10分钟,带上1头奶牛的话,是13分钟,2头奶牛是17分钟,3头是23分钟,4头是123分钟,将5头一次性载过去,花费的时间是124分钟。
样例输出 Sample Output
50
输出说明:
Farmer John第一次带3头奶牛过河(23分钟),然后一个人划回来(10分钟),最后带剩下的2头奶牛一起过河(17分钟),总共花费的时间是23+10+17 = 50分钟。

code

#include <bits/stdc++.h>
#define up(i, a, b) for(register int i = a; i <= b; ++i)
#define down(i, a, b) for(register int i = a; i >= b; i--) 
using namespace std;
const int MAXX = 2550;
typedef long long ll;

inline int read() {
	int s = 0, w = 1;
	char ch = getchar();
	while (!isdigit(ch)) { if(ch == '-') w = -1; ch = getchar(); }
	while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
	return s * w;
}

int n, m;
int w[MAXX], f[MAXX], sum[MAXX]; 

int main() {
	n = read(); m = read();
	sum[0] = m;
	for(int i = 1; i <= n; ++i) {
		w[i] = read();
		sum[i] = sum[i - 1] + w[i];
	}
	for(int i = 1; i <= n; ++i) {
		f[i] = sum[i];
		for(int j = 1; j < i; ++j) {
			f[i] = min(f[i], f[j] + sum[i - j] + m);
		}
	}
	printf("%d\n", f[n]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34493840/article/details/86143785