JZOJ 5408 【NOIP2017提高A组集训10.21】Dark

来源:互联网 发布:foxit editor mac 编辑:程序博客网 时间:2024/06/06 19:03

Dark

Description

一个长度为n的非负整数序列A,每次可以选择这个序列中的两个相邻的正整数,让他们的值同时减1,不停操作直到不存在满足条件的数。
问最少的操作次数。

Data Constraint

这里写图片描述

Solution

我们记状态f[i][j][0/1]表示第i个数的当前值为j,它的上一个值是否为0的最少操作次数。
发现这样子转移到的状态只与当前状态有关,再维护一个后缀最值转移即可。
方程转移式很容易推,实在不懂可以看看标程。

Code

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,j,l) for(int i=j;i<=l;i++)#define fd(i,j,l) for(int i=j;i>=l;i--)using namespace std;typedef long long ll;const ll N=11e4,M=11e5;int f[2][M][2],a[N],q[N],g[M];int n,m,j,k,l,i;void read(int &o){    o=0; char ch=' ';    for(;ch<'0'||ch>'9';)ch=getchar();    for(;ch>='0'&&ch<='9';ch=getchar())o=o*10+ch-48;}int min(int a,int b){if(a<b)return a;else return b;}int max(int a,int b){if(a>b)return a;else return b;}int main(){    cin>>n;    fo(i,1,n)read(a[i]),q[i]=q[i-1]+a[i];    int u=0,v;    fo(i,1,n)    {        v=1-u;        fo(l,0,a[i])f[v][l][0]=f[v][l][1]=2*q[n];        g[a[i-1]+1]=q[i-1]/2+2;        fd(l,a[i-1],0)g[l]=min(g[l+1],f[u][l][0]);        fo(l,max(0,a[i]-a[i-1]+1),a[i])        f[v][l][1]=g[a[i]-l+1]+a[i]-l;        fo(l,0,min(a[i-1],a[i]))        f[v][a[i]-l][0]=min(min(f[u][l][0],f[u][l][1])+l,f[v][a[i]-l][0]);        u=v;    }    int ans=q[n]/2;    fo(i,0,a[n])ans=min(ans,f[u][i][0]);    ans=min(ans,f[u][0][1]);    printf("%d",ans);}
阅读全文
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 铝被酸腐蚀怎么办 新娘头饰氧化了怎么办 合金饰品变黑了怎么办 麻醉机fico2升高怎么办 快递被恶意投诉怎么办 顺风快递收件人拒收怎么办 手机联系人没了怎么办 收件人号码错了怎么办 收件人写错了怎么办 快递联系不到收件人怎么办 小孩烫伤有水泡怎么办 被烫伤的疤痕怎么办 微店别人下单后怎么办 月经超了七天怎么办 收件人不在指定地址怎么办 2017款宝来熄火后异响怎么办 我身高一八米怎么办呀 规格型号错了发票怎么办 合同签错了怎么办 柜子背板起泡怎么办啊 显卡红灯不亮怎么办 小米设置全英文怎么办 小米手机变英文怎么办 阿迪贝壳头变黄怎么办 网友问我名字怎么办 护照姓名拼写错误怎么办 cfa报名时填错名字怎么办 机票拼音错了怎么办 evus忘填了怎么办 嘴唇有点歪了怎么办 淡奶油打发出水怎么办 怀孕第二次见红怎么办 孕妇第二次见红怎么办 微信不显示步数怎么办 小说父亲的名字怎么办 苹果手机芯片坏了怎么办 外地手机卡丢了怎么办 名字中点那个点怎么办 信用卡批不下来怎么办 菲律宾旅游签证过期怎么办 百香果施肥多了怎么办