点击打开链接

题意:

有n个奶牛分别有对应的兴趣值,现在对奶牛分组,每组成员不少于t,

在每组中所有的成员兴趣值要减少到该组的最小值,问总共最少需要减少的兴趣值是多少。

思路:

斜率优化+DP
转移方程为:f[i]=min{ f[j]+sum[i]-sum[j]+(i-j)*a[j+1] } T<=j<=i-T
其中sum表示a的前缀和。
如果j>k且决策j优于决策k则有
f[j]-f[k]+sum[k]-sum[j]-k*a[k+1]+j*a[j+1]<i*(a[j+1]-a[k+1])
维护指定区间内的下凸包即可。
需要注意的是输入输出用int64,而且斜率部分不能用之前直接除的写法了,因为a有long long,可能误差会比较大,改用化除为乘的方法。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define mp(x,y) make_pair(x,y)
const int INF = 0x3f3f3f3f;
const ll INFll = 0x3f3f3f3f3f3f3f3fll;
inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
//
const int maxn = 4e5+10;int L,R,n,T,q[maxn];
ll a[maxn],dp[maxn],sum[maxn];ll getup(int j,int k){return dp[j]-dp[k]-sum[j]+sum[k]+j*a[j+1]-k*a[k+1];
}
ll getdown(int j,int k){return a[j+1]-a[k+1];
}int main(){while(scanf("%d%d",&n,&T)==2){dp[0]=sum[0]=0;a[0]=0;for(int i=1; i<=n; i++)scanf("%I64d",&a[i]);sort(a+1,a+1+n);for(int i=1; i<=n; i++)sum[i] = sum[i-1]+a[i];int L=0,R=0;for(int i=1; i<=n; i++){while(L<R && getup(q[L+1],q[L]) <= i * getdown(q[L+1],q[L])) L++;int j = q[L];dp[i] = dp[j]+(sum[i]-sum[j])-(i-j)*a[j+1];int t = i-T+1;
// 从t~i是一组, T是最小的长度, 所以要考虑R与第t个比较,如果与t+1比较,那可能会
//把第t个弹出,就不可能是最优解了,也就是不能形成长度为>=T的按顺序的一段。if(t >= T){while(L<R && getup(t,q[R])*getdown(q[R],q[R-1]) <= getup(q[R],q[R-1])*getdown(t,q[R]))R--;q[++R] = t;    }}printf("%I64d\n",dp[n]);}return 0;
}

hdu3045 Picnic Cows(斜率优化DP)相关推荐

  1. POJ2018 Best Cow Fences —— 斜率优化DP

    题目链接:https://vjudge.net/problem/POJ-2018 Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K T ...

  2. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  3. CF-311B Cats Transport(斜率优化DP)

    题目链接 题目描述 小S是农场主,他养了 \(M\)只猫,雇了 \(P\) 位饲养员. 农场中有一条笔直的路,路边有 \(N\) 座山,从 \(1\) 到 \(N\)编号. 第 \(i\) 座山与第 ...

  4. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  5. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  6. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  7. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  8. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  9. YBTOJ洛谷P3195:玩具装箱(斜率优化dp)

    传送门 文章目录 前言 解析 代码 前言 斜率优化dp,就是利用斜率优化的dp (逃) 解析 第一道斜优的题 分析题目 设sumisum_isumi​为1-i的c的前缀和 容易写出dp转移式: dpi ...

最新文章

  1. Maven学习总结(八)——使用Maven构建多模块项目
  2. golang源码分析:编译过程词法解析的流程
  3. 运行Vue在ASP.NET Core应用程序并部署在IIS上
  4. jQuery入门[2]-选择器[转]
  5. 多年前的树莓派 B+ 重新工作
  6. thinkphp实现当前页面点击下载文件实例
  7. spring加载属性(properties)文件
  8. 如何在win 8的64位下破解安装EPLAN
  9. 苹果分屏软件_苹果iOS14曝光,全是安卓已有的功能!
  10. IDEA崩溃:A fatal error has been detected by the Java Runtime Environment解决方案
  11. request method ‘DELETE‘ not supported报错处理
  12. torch.cat()函数的官方解释,详解以及例子
  13. python获取cpu温度_如何获得树莓派CPU实时温度值
  14. AT89C51单片机制作密码锁,真的很详细了
  15. matlab 指纹,一种基于matlab的指纹识别方法
  16. bzip2格式文件解压
  17. bim的二次开发需要什么语言_CAD二次开发语言简介
  18. G711 G729音频编码总结
  19. 北京,有2000万人假装在生活
  20. 网络视频聊天室的开发指南

热门文章

  1. python 制作srt字幕
  2. 阿里云服务器迁移到其他主体(公网ip不变)
  3. 实战|手把手教你用Python爬虫(附详细源码)
  4. [Excel知识技能] 将“假“日期转为“真“日期格式
  5. 三、大数据技术之Linux下篇(linux学习)
  6. dhrystone测试结果_CPU性能测试分析MIPS、DMIPS
  7. 通用互联网应用架构图
  8. Lectra Formaris v5R1C1\
  9. java 获取剪切板_Java中有关剪切板的操作
  10. 《神经质的实质与治疗》读后感