bzoj1863 [Zjoi2006]trouble 皇帝的烦恼 二分+DP
来源:互联网 发布:表演者言 知乎 编辑:程序博客网 时间:2024/04/28 05:27
题意:给定一个数列a,第i个人要a[i]个勋章,相邻两个不能有相同的勋章。问最少需要多少个勋章。
二分,问题是怎么判断。
设一个mn,mx表示第i个人和第一个人最多/少有多少个勋章和第一个人相同,那么在保证和前一个的没有相同的情况下往后推,那么看第n个人的mn是否==0就可以了。
问题是怎么推。。
这个挺简单的,要不新开一个要不然就是总数减去前一个的最小。
这个有点恶心= =,由于希望重合的部分尽量小,所以要不然不重合要不然重合尽量小。
如何让重合尽量小?我们现在有x个勋章,那么
#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=3e5+5;const int mo=1e9+7;typedef long long ll;int n,m;ll l,r;ll a[N],mn[N],mx[N];inline bool pd(ll x){ mx[1]=mn[1]=a[1]; fo(i,2,n) { mx[i]=min(a[i],a[1]-mn[i-1]); mn[i]=max(0ll,a[1]+a[i]+a[i-1]-x-mx[i-1]); } return mn[n]==0;}int main(){ scanf("%d",&n); fo(i,1,n)scanf("%lld",&a[i]),l=max(l,a[i]+a[i-1]); r=l*2;ll ans=0; while (l<=r) { ll mid=(l+r)>>1; if (pd(mid))r=mid-1,ans=mid; else l=mid+1; } printf("%lld\n",ans);}
阅读全文
1 0
- BZOJ1863 [Zjoi2006]trouble 皇帝的烦恼 二分答案+DP
- bzoj1863 [Zjoi2006]trouble 皇帝的烦恼 二分+DP
- bzoj1863[Zjoi2006] trouble 皇帝的烦恼(二分+dp)
- 【bzoj1863】【zjoi2006】【皇帝的烦恼】【二分+dp】
- [bzoj1863][Zjoi2006]trouble 皇帝的烦恼
- 【bzoj1863】[Zjoi2006]trouble 皇帝的烦恼
- bzoj1863 [Zjoi2006]trouble 皇帝的烦恼
- 【DP/二分】BZOJ 1863:[Zjoi2006]trouble 皇帝的烦恼
- BZOJ 1863 [Zjoi2006]trouble 皇帝的烦恼【dp+二分】
- [codevs1513][BZOJ1863]皇帝的烦恼(二分+dp)
- bzoj 1863: [Zjoi2006]trouble 皇帝的烦恼(二分答案+dp)
- 【bzoj 1863】[Zjoi2006]trouble 皇帝的烦恼(二分答案+dp)
- BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼 二分
- 1863: [Zjoi2006]trouble 皇帝的烦恼
- BZOJ 1863: [ZJOI2006]trouble 皇帝的烦恼
- 省选专练ZJOI2006皇帝的烦恼
- BZOJ 1863 ZJOI 2006 皇帝的烦恼 二分答案
- CodeVS1513 皇帝的烦恼
- LCT知识点
- 「音视频直播技术」OpenGL渲染之着色器
- jeesite框架
- bzoj1131 树形dp
- 文档流
- bzoj1863 [Zjoi2006]trouble 皇帝的烦恼 二分+DP
- 工厂模式
- 公钥密码 之 素数,费马定理与欧拉定理
- 适配器模式
- CS50 2016-Week4 学习笔记
- 观察者模式
- JavaScript之this的工作原理
- 函数指针
- 【爬虫】爬取猫眼电影top100