bzoj1484: [HNOI2009]通往城堡之路
来源:互联网 发布:cp交易网络是什么意思 编辑:程序博客网 时间:2024/04/30 15:29
传送门
这题太迷的。。。
并不会证这个玩意为什么是对的。。。
固定第一个点的值,其他点的值取a[i]-(i-1)*d(这个点能取的最小值)
然后每次找一个后缀,把这个后缀所有数加一个大于0的值,且保证这是最优的取法下加的尽量大的值。
由于每次把一个数加到最值所以复杂度是O(n2)的。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#define N 5005#define ll long longusing namespace std;ll a[N],b[N],cas,n,d,inf,ma,val,num,pos,tar,ans;int main(){ scanf("%lld",&cas); while (cas--){ scanf("%lld%lld",&n,&d); for (ll i=1;i<=n;i++) scanf("%lld",&a[i]); if (abs(a[n]-a[1])>(n-1)*d){ printf("impossible\n"); continue; } b[1]=a[1]; for (ll i=2;i<=n;i++) b[i]=b[i-1]-d; inf=1e18; while (a[n]!=b[n]){ ma=-inf; val=inf; num=0; for (ll i=n;i>1;i--){ if (b[i]<a[i]){ num++; val=min(val,a[i]-b[i]); } else num--; if (num>ma&&b[i]!=b[i-1]+d){ pos=i; tar=val; ma=num; } } tar=min(tar,b[pos-1]+d-b[pos]); for (ll i=pos;i<=n;i++) b[i]+=tar; } ans=0; for (int i=1;i<=n;i++) ans+=abs(a[i]-b[i]); printf("%lld\n",ans); }}
0 0
- bzoj1484: [HNOI2009]通往城堡之路
- [bzoj 1484] HNOI2009 通往城堡之路
- BZOJ 1484: [HNOI2009]通往城堡之路
- luogu P3202 [HNOI2009]通往城堡之路
- [乱搞] BZOJ 1484 [HNOI2009]通往城堡之路
- bzoj 1484 [HNOI2009]通往城堡之路 贪心
- hnoi 2009 通往城堡之路
- 通往阿里之路
- 通往大神之路
- 通往java高手之路
- 通往架构师之路
- 通往幸福之路之贷款篇
- 通往弹性软件架构之路
- 打破沙锅 ---通往网管之路
- 通往python之路(一)
- 通往测试架构师之路
- 通往测试架构师之路
- 通往测试架构师之路
- 算法设计与应用基础:第十周
- 阶乘和
- String/StringBuffer/StringBuilder对比
- 自动化运维工具Ansible详细部署
- tensorflow常用函数介绍
- bzoj1484: [HNOI2009]通往城堡之路
- JS:事件循环机制、调用栈以及任务队列
- Java多线程(二)
- 二叉树的下一个结点
- 理解Python 装饰器
- OJ 2924 Problem A 文件操作--二进制文件读入
- ACM日记_17.5.01——控制格式的输出就只会printf了?cout也可以!
- sscanf函数的用法
- 进程创建system、exec、fork