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] 征途[斜率优化]的更多相关文章

  1. P4072 [SDOI2016](BZOJ4518) 征途 [斜率优化DP]

    题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...

  2. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  3. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  4. BZOJ 4518: [Sdoi2016]征途 [斜率优化DP]

    4518: [Sdoi2016]征途 题意:\(n\le 3000\)个数分成m组,一组的和为一个数,求最小方差\(*m^2\) DP方程随便写\(f[i][j]=min\{f[k][j-1]+(s[ ...

  5. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  6. 【BZOJ4518】[Sdoi2016]征途 斜率优化

    [BZOJ4518][Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除 ...

  7. 【bzoj4518】[Sdoi2016]征途 斜率优化dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6812435.html 题目描述 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界 ...

  8. [bzoj4518][Sdoi2016]征途-斜率优化

    Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...

  9. [SDOI2016]征途 —— 斜率优化DP

    时隔多年没有碰斜率优化了... 想当年被斜率优化虐的死去活来,现在看看...也就那样吧. Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计 ...

随机推荐

  1. assert 函数

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( i ...

  2. tp数据库操作

    1.常见的数据库操作//插入记录// $insert=Db::execute("insert into tp_user (username,password) values ('dome', ...

  3. javascript 打印错误信息 catch err

    使用 console.log(err); 是无法打印出来的.默认只能打印出错误信息.如图 http.interceptors.response.use(response => { return ...

  4. Python 算法(2) 哈夫曼编码 Huffman Encoding

    这个问题原始是用来实现一个可变长度的编码问题,但可以总结成这样一个问题,假设我们有很多的叶子节点,每个节点都有一个权值w(可以是任何有意义的数值,比如它出现的概率),我们要用这些叶子节点构造一棵树,那 ...

  5. Unity和安卓互调

    Unity调安卓 AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); And ...

  6. Visual Studio:error MSB8020

    状况如下: error MSB8020: The builds tools for v120 (Platform Toolset = 'v120') cannot be found. To build ...

  7. python保存爬取的图片

    用爬虫抓取图片的保存 保存图片 request=urllib2.Request(randNumberUrl,data,headers) picture=opener.open(request).rea ...

  8. udacity android 实践笔记: lesson 4 part b

    udacity android 实践笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  9. Linux下清空缓冲区的方法

    Linux下清空缓冲区的方法 C标准规定fflush()函数是用来刷新输出(stdout)缓存的.对于输入(stdin),它是没有定义的.但是有些编译器也定义了fflush( stdin )的实现,比 ...

  10. postgresql data数据目录路径迁移

    默认的数据库路径是/var/lib/pgsql/9.x/data 将现有的数据库文件全部拷贝到新的数据库路径下,然后重启 新建一个路径作为新的数据库数据路径,假如是/home/data sudo mk ...