【gmoj】 【洛谷 P7404】【差分】有趣的家庭菜园 4
题目
解题思路
题意就是让前半段草的高度呈上升趋势 后半段呈下降趋势
考虑差分出草的高度
f[i] 表示以i为k的前半段需浇水量
g[i] 表示以i-1为k的后半段需浇水量
最后答案取min(f[i],g[i+1])
如果当前b[i]为负数 说明它比前一个小 为了满足前半段呈上升趋势 需要浇水 f[i]增加
如果当前b[i]为正数 说明它比前一个大 为了满足后半段呈下降趋势 需要浇水 给它前面的浇,为了好统计,就加在它这里 g[i]增加
代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n,ans=1e+15,a[200100],b[200100],f[200100],g[200100];
int main()
{
ans=ans*2;
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
b[i]+=a[i];
b[i+1]-=a[i];
}
for (int i=2;i<=n;i++)
{
f[i]=f[i-1];
if (b[i]<=0) f[i]+=-b[i]+1;
}
for (int i=n;i>0;i--)
{
g[i]=g[i+1];
if (b[i]>=0) g[i]+=b[i]+1;
}
for (int i=1;i<=n;i++)
ans=min(ans,max(f[i],g[i+1]));
printf("%lld",ans);
return 0;
}