[SDOI2016 Round1] 征途[斜率优化]
2225. [SDOI2016 Round1] 征途
★★★☆ 输入文件:menci_journey.in 输出文件:menci_journey.out 简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
Pine 开始了从 S 地到 T 地的征途。
从 S 地到 T 地的路可以划分成 n 段,相邻两段路的分界点设有休息站。
Pine 计划用 m 天到达 T 地。除第 m 天外,每一天晚上 Pine 都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine 希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助 Pine 求出最小方差是多少。
设方差是 v,可以证明,v×m2 是一个整数。为了避免精度误差,输出结果时输出 v×m2。
【输入格式】
第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度。
【输出格式】
一个数,最小方差乘以 m2 后的值。
【样例输入】
5 2
1 2 5 8 6
【样例输出】
36
【提示】
对于 30% 的数据,1≤n≤10。
对于 60% 的数据,1≤n≤100。
对于 100% 的数据,1≤n≤3000。
保证从 S 到 T 的总路程不超过 30000。
【来源】
SDOI2016 Round1 Day2
数据已由出题人修正
我们把f[i][j]作为用过了第i次一共取了j个数的最小值.

斜率优化:

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll; #define pf(x) ((x)*(x))
#define FRE(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif const int N=;
int n,m,a[N],q[N];
ll ans,sum[N],f[N][N];
inline double get(int i,int x,int y){
return ((double)(f[i][x]-f[i][y]+pf(sum[x])-pf(sum[y])))/((double)(sum[x]-sum[y]));
}
int main(){
FRE(menci_journey);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-]+a[i];
memset(f,0x3f3f3f3f,sizeof f);
f[][]=;
for(int i=;i<=m;i++){
int h=,t=;
for(int j=;j<=n;j++){
while(h<t&&get(i-,q[h+],q[h])<(double)(sum[j]<<)) h++;//获取当前最优k
f[i][j]=f[i-][q[h]]+pf(sum[j]-sum[q[h]]);
while(h<t&&get(i-,q[t],q[t-])>get(i-,j,q[t])) t--;//维护min(slope)
q[++t]=j;
}
}
ans=f[m][n]*m-pf(sum[n]);
printf(LL,ans);
return ;
}
[SDOI2016 Round1] 征途[斜率优化]的更多相关文章
- P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]
题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...
- 洛谷 P4072 [SDOI2016]征途 斜率优化DP
洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...
- bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)
题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...
- BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]
4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...
- bzoj4518[Sdoi2016]征途 斜率优化dp
4518: [Sdoi2016]征途 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1657 Solved: 915[Submit][Status] ...
- 【BZOJ4518】[Sdoi2016]征途 斜率优化
[BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...
- 【bzoj4518】[Sdoi2016]征途 斜率优化dp
原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...
- [bzoj4518][Sdoi2016]征途-斜率优化
Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...
- [SDOI2016]征途 —— 斜率优化DP
时隔多年没有碰斜率优化了... 想当年被斜率优化虐的死去活来,现在看看...也就那样吧. Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计 ...
随机推荐
- 摘:常用函数(包括:宽字符函数、普通C函数 )
只要看见“W”就是宽的意思,左边wchar_t,右边char 字符分类: 宽字符函数 普通C函数 描述 iswalnum() isa ...
- numpy和matplotlib绘制直方图
使用 Matplotlib Matplotlib 中有直方图绘制函数:matplotlib.pyplot.hist()它可以直接统计并绘制直方图.你应该使用函数 calcHist() 或 np.his ...
- blender, 创建多边形面片
按a键清除所有选择,进入Edit Mode,选vertex select方式.然后按住control,使用MLB连续画多个顶点,形成一个多边形,如图所示: 然后同时选中两个端点,点Make Edge/ ...
- Genral log(普通日志)与 Slow log(慢速日式)
General log: Geleral log记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {T ...
- CControlLayer
#ifndef __CONTROLLAYER_H__ #define __CONTROLLAYER_H__ #include "XWidget.h" class CMapDialo ...
- 图解Sysprep封装系统
图解Sysprep封装系统 一.使用安装管理器工具创建 Sysprep.inf 应答文件 要安装“安装管理器”工具并创建应答文件,请按照下列步骤操作: 1)打开“我的电脑”,然后打开 Wind ...
- VisualStudio“在查找预编译头使用时跳过"解决方案
解决方案1:确保所有的cpp文件都包含了stdafx.h,且确保stdafx.h是第一个#include指令(经尝试,可行) 解决方案2:去掉预编译头 项目->属性->配置属性->c ...
- request的生存期只限于服务器跳转
症状: 刚才想做一个实验,在a.jsp中向request添加属性(页面编码为UTF-8),在b.jsp中删除该属性(页面编码为ISO-8859-1),通过ServletRequestAttribute ...
- python学习笔记(5)--泡菜:永久存储
说明: 1. 导入pickle泡菜模块. 2. wb方式(二进制)创建.pkl文件. 3. pickle.dump把一个数组或什么数据灌进这个新建的文件. 4. 然后就生成了一个pkl文件,用来存放数 ...
- Android——Activity恢复用户用EditText输入的数据
说明: 在横屏输入的内容,在Activity销毁后,即横屏后,获取用户输入的内容 步骤: 1.在xml页面定义EditText的id 2.用onSaveInstanceState保存用户输入的数据 ( ...