题意:将n个数分成若干组,每组数字的个数不少于t个,要把每组的数字减小到这组最小值,求所有数字减少的最小值。

先将这n个数从小到大排个序,可以想到一组里面的数一定是排序后相邻的。

设d(i)表示前i个数分完组以后减少的最小值,考虑j~i为一组,则有状态转移方程

还是一样的处理方法,设k < j ≤ i - t,且j~i为一组的值比k~i为一组的值更优。

则有不等式:

化简,把i分离出来,整理成斜率的形式:

写到这里就应该很清楚地能够看出来X和Y的表达式了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. typedef long long LL;
  8.  
  9. const int maxn = + ;
  10.  
  11. int n, t;
  12.  
  13. LL a[maxn], sum[maxn];
  14. LL d[maxn];
  15.  
  16. int head, tail;
  17. int Q[maxn];
  18.  
  19. LL inline Y(int x) { return d[x-] - sum[x-] + a[x] * (x - ); }
  20.  
  21. LL inline DY(int p, int q) { return Y(q) - Y(p); }
  22.  
  23. LL inline DX(int p, int q) { return a[q] - a[p]; }
  24.  
  25. int main()
  26. {
  27. while(scanf("%d%d", &n, &t) == )
  28. {
  29. for(int i = ; i <= n; i++) scanf("%I64d", a + i);
  30. sort(a + , a + + n);
  31. for(int i = ; i <= n; i++) sum[i] = sum[i-] + a[i];
  32.  
  33. memset(d, , sizeof(d));
  34. for(int i = t; i < * t && i <= n; i++) d[i] = sum[i] - a[] * i;
  35.  
  36. head = tail = ;
  37. Q[tail++] = ;
  38. for(int i = t * ; i <= n; i++)
  39. {
  40. while(head + < tail && DY(Q[tail-], i-t+) * DX(Q[tail-], Q[tail-]) <= DY(Q[tail-], Q[tail-]) * DX(Q[tail-], i-t+)) tail--;
  41. Q[tail++] = i - t + ;
  42. while(head + < tail && DY(Q[head], Q[head+]) <= DX(Q[head], Q[head+]) * i) head++;
  43. d[i] = d[Q[head]-] + sum[i] - sum[Q[head]-] - (i-Q[head]+) * a[Q[head]];
  44. }
  45.  
  46. printf("%I64d\n", d[n]);
  47. }
  48.  
  49. return ;
  50. }

代码君

HDU 3045 DP 斜率优化 Picnic Cows的更多相关文章

  1. HDU 3480 DP+斜率优化

    题意:给你n个数字,然后叫你从这些数字中选出m堆,使得每一堆的总和最小,一堆的总和就是这一堆中最大值减去最小值的平方,最后要使得所有堆加起来的总和最小. 思路:对这些数字排序之后,很容易想到DP解法, ...

  2. hdu 3507(DP+斜率优化)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. HDU 3480 DP 斜率优化 Division

    把n个数分成m段,每段的值为(MAX - MIN)2,求所能划分得到的最小值. 依然是先从小到大排个序,定义状态d(j, i)表示把前i个数划分成j段,所得到的最小值,则有状态转移方程: d(j, i ...

  4. hdu 2829 Lawrence(斜率优化DP)

    题目链接:hdu 2829 Lawrence 题意: 在一条直线型的铁路上,每个站点有各自的权重num[i],每一段铁路(边)的权重(题目上说是战略价值什么的好像)是能经过这条边的所有站点的乘积之和. ...

  5. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  6. 【BZOJ-4518】征途 DP + 斜率优化

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

  7. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  8. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  9. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

随机推荐

  1. CVE-2017-5638——S2-045

    一. 漏洞简介 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于创建企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品: Stru ...

  2. Unix高级编程之文件权限

    1.访问权限表 st_mode 意义 S_IRUSR 用户-读 S_IWUSR 用户-写 S_IXUSR 用户-执行 S_IRGRP 组-读 S_IWGRP 组-写 S_IXGRP 组-执行 S_IR ...

  3. The Weakest Sith

    http://codeforces.com/gym/101149/problem/F 题目要输出最丑陋的衣服.所以每件衣服都要和其他衣服比一次. 但是注意到,能赢一件衣服的衣服,就算是好衣服了. 那么 ...

  4. watir-webdriver使用过程中异常

    1.在jruby版本1.6.7中,报异常:not such file to load --watir-webdriver 解决方法 :在文件的首行添加:require 'rubygems'       ...

  5. h5画圆

    下面一段代码是,h5的画圆,半圆,四分之一圆等效果 <!DOCTYPE html> <html lang="en"> <head> <me ...

  6. Kettle Rest大文件上传(RestUploadFile.ktr) Rest文件下载(FileDownload.ktr)

    1. Rest大文件上传(RestUploadFile.ktr) 需求描述 上传文件大于10M小于500M 上传文件进行分片(5M一片要比1M分片整体时间快) 先使用java类进行功能模拟在迁移Ktr ...

  7. arcgis jsapi接口入门系列(6):样式

    symbol: function () { //线样式 //样式详情请看官方文档 let style = { //线颜色,支持多种格式: //CSS color string:例如"dodg ...

  8. Java文件操作系列[1]——PDFBox实现分页提取PDF文本

    需求:用java分页提取PDF文本. PDFBox是一个很好的可以满足上述需求的开源工具. 1.PDF文档结构 要解析PDF文本,我们首先要了解PDF文件的结构. 关于PDF文档,最重要的几点: 一, ...

  9. Windows系统下Android开发环境搭建

    “工具善其事,必先利其器”.要想学好Android,搭建好Android开发环境是一个良好的开端. Windows系统下Android开发环境主要有4个大的步骤.分别是: 1.JDK的安装 2.ecl ...

  10. 【2016新年版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...