【BZOJ1150】数据备份(动态规划,凸优化)
2024-08-28 00:48:16
【BZOJ1150】数据备份(动态规划,凸优化)
题面
题解
在不考虑\(K\)的情况下很容易\(dp\)
如果把\(K\)考虑进状态显然是\(O(n^2)\)级别。
所以凸优化一下即可。
注意一下是一个下凸函数,所以是没操作一次就要减去一个权值。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 100100
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,K;
ll s[MAX];
struct Node{ll x,y;}f[2][MAX];
Node operator+(Node a,int b){return (Node){a.x+b,a.y};}
bool operator<(Node a,Node b){return a.x<b.x;}
void calc(int C)
{
memset(f,63,sizeof(f));
f[0][1]=(Node){0,0};
for(int i=2;i<=n;++i)
{
f[0][i]=min(f[0][i-1],f[1][i-1]);
f[1][i]=(Node){f[0][i-1].x+(s[i]-s[i-1])-C,f[0][i-1].y+1};
}
f[0][n]=min(f[1][n],f[0][n]);
}
int main()
{
n=read();K=read();
for(int i=1;i<=n;++i)s[i]=read();
ll l=0,r=s[n],ans=0;
while(l<=r)
{
ll mid=(l+r)>>1;
calc(mid);
if(f[0][n].y<=K)l=mid+1,ans=f[0][n].x+K*mid;
else r=mid-1;
}
printf("%lld\n",ans);
return 0;
}
最新文章
- 《Git教程-廖雪峰》学习笔记
- docker 源码分析 三(基于1.8.2版本),NewDaemon启动
- 让div固定在顶部不随滚动条滚动
- USACO 5.4 Twofive(DP)
- iOS-集成阿里百川IMSDK的服务端及客户端
- UITableViewCell 自适应高度 ios8特性
- 【转】android开发工具Eclipse,androidStudio,adt网盘下载--不错
- 亲手用模块化方式写一个jquery QQ表情插件。
- Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现
- 【转】ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件
- Objective-C日记-Bounds和Frame
- selenium爬取百度图片
- otter代码在IDEA远程DEBUG方法
- textarea--去掉空格的办法
- 简单的Windows应用程序命名规则
- Feign api调用方式
- .NET基于Eleasticsearch搭建日志系统实战演练
- 将 nginx 安装成 windows 的方法
- SOAPUI 測试Http 协义
- SQLServer覆盖索引
热门文章
- TPO-22 C2 Revise a music history paper
- TPO-20-Apply for the undergraduate research fund
- EventBus的基本使用步骤
- 基于zookeeper实现分布式锁(续)
- RAID卡的结构详解
- ResNet——Deep Residual Learning for Image Recognition
- Java多线程编程之不可变对象模式
- Django_杂
- Final发布用户使用报告 -- Thunder团队
- TeamWork#3,Week5,Scrum Meeting 11.4