题目描述

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一个人把木筏从对岸划回来接下一批的奶牛的时间。

输入

* 第1行: 2个用空格隔开的整数:N 和 M

* 第2..N+1行: 第i+1为1个整数:M_i

输出

* 第1行: 输出1个整数,为FJ把所有奶牛都载过河所需的最少时间

样例输入

5 10
3
4
6
100
1

样例输出

50


题解

dp

f[i]表示运完前i头牛后返回的最小时间。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sum[2501] , f[2501];
int main()
{
int n , m , i , j , t;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d" , &t);
sum[i] = sum[i - 1] + t;
}
memset(f , 0x7f , sizeof(f));
f[0] = 0;
for(i = 1 ; i <= n ; i ++ )
for(j = 0 ; j < i ; j ++ )
f[i] = min(f[i] , f[j] + 2 * m + sum[i - j]);
printf("%d\n" , f[n] - m);
return 0;
}

最新文章

  1. 第1章Java入门体验
  2. 请求WebMethod, Ajax 处理更加专注
  3. Retina视网膜屏中CSS3边框图片像素虚边的问题
  4. RPC框架Thrift例子-PHP调用C++后端程序
  5. 对不起,说句粗话——这个太屌了,windows1.0安装程序(附下载)
  6. 上下文菜单与TrackPopupMenu
  7. Python2 中文编码处理
  8. 如何架构一个合适的企业API网关
  9. Django 加载 app 中的urls
  10. JavaScript栈和队列
  11. altium designer 制作内部不铺铜的封装,如三极管下面禁止铺铜
  12. Context家族
  13. windows下一分钟配置ngnix实现HLS m3u8点播
  14. 程序员大佬推荐的java学习路线
  15. python的十进制与任意进制的转换
  16. POJ 1166 暴力搜索 即 枚举
  17. 四、java面向对象编程_2
  18. Smack 广播
  19. Linux route命令
  20. [典型漏洞分享]结合YS业务分析使用oauth协议的风险

热门文章

  1. Nginx初体验(一):nginx介绍
  2. 【BZOJ3611】大工程(虚树,动态规划)
  3. Android:Gradle报错——No resource found that matches the given name (at &#39;dialogCornerRadius&#39; with value &#39;?android:attr/dialogCornerRadius&#39;)
  4. P/Invoke 光标的操作
  5. OSG-阴影
  6. HTML+JS = 网站注册界面源代码
  7. 百度翻译api 实现简易微信翻译小程序
  8. jetbrains系列激活
  9. NMAP-高级用法
  10. Coins and Queries(map迭代器+贪心)