博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1150:[CTSC2007]数据备份Backup
阅读量:5366 次
发布时间:2019-06-15

本文共 1311 字,大约阅读时间需要 4 分钟。

可以发现,选的电缆越多,权值和越大,并且斜率呈单调递增,图像是一个下凸壳的形式

那么我们就可以\(\rm wqs\)二分解决这个问题

二分斜率,我们就可以去掉那个\(k\)的限制

\(f[i][0/1]\)表示前\(i\)个数,第\(i\)个数选/不选的最小代价

由贪心可知,我们选的电缆一定是相邻的

所以就可以愉快的写出代码了

#include
#include
#include
using namespace std;#define rg register#define int long longvoid read(int &x){ char ch;bool ok; for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1; for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar()); if(ok)x=-x;}const int maxn=1e5+10;int n,k,a[maxn],b[maxn],sum,ans;struct oo{int x,y;}f[maxn][2];bool check(int x){ for(rg int i=2;i<=n;i++){ if(f[i-1][1].y
f[i-1][0].y)f[i][0]=f[i-1][0]; else if(f[i-1][1].x>f[i-1][0].x)f[i][0]=f[i-1][0]; else f[i][0]=f[i-1][1]; f[i][1]=(oo){f[i-1][0].x+1,f[i-1][0].y+a[i]-a[i-1]-x}; } oo now; if(f[n][0].y
f[n][1].y)now=f[n][1]; else if(f[n][0].x>f[n][1].x)now=f[n][1]; else now=f[n][0]; if(now.x<=k)return sum=now.y,1; else return 0;}signed main(){ read(n),read(k);int l=0,r=0; for(rg int i=1;i<=n;i++)read(a[i]),r+=a[i]; while(l<=r){ int mid=(l+r)>>1; if(check(mid))l=mid+1,ans=sum+mid*k; else r=mid-1; } printf("%lld\n",ans);}

转载于:https://www.cnblogs.com/lcxer/p/11156287.html

你可能感兴趣的文章
Apache Tomcat部署java web项目
查看>>
转泛型
查看>>
【8.22校内测试】【数学】【并查集】【string】
查看>>
第二周 9.6-9.12
查看>>
347. Top K Frequent Elements
查看>>
angular4.0配置同时使用localhost和本机IP访问项目
查看>>
用mkdirs创建目录
查看>>
[转] Web前端优化之 Server篇
查看>>
如何让一个div的大小,从某一个特定值开始,随内容的增加而自动变化?
查看>>
BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
查看>>
P1977 出租车拼车(DP)
查看>>
iOS开发--完整项目
查看>>
我的博客园皮肤模板
查看>>
正则表达式
查看>>
java基础:不同进制的表现形式
查看>>
Base64转换为blob对象
查看>>
gulp自动化压缩合并、加版本号解决方案
查看>>
windows下面安装Python和pip教程
查看>>
Java 动态向 JTable 中添加数据
查看>>
平安科技移动开发二队技术周报(第九期)
查看>>