有一个洞穴,往里面灌水,问最多能储存多少水。
这道题紫书上面讲的很透彻,大致就是从左右分别扫描得出每一块的水位值。
AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
int p[1000010],s[1000010],a[1000010],b[1000010];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
for(int i=0;i<n;i++)
scanf("%d",&s[i]);
int level=s[0];
for(int i=0;i<n;i++)
{
if(level<p[i])
level=p[i];
if(level>s[i])
level=s[i];
a[i]=level;
}
level=s[n-1];
for(int i=n-1;i>=0;i--)
{
if(level<p[i])
level=p[i];
if(level>s[i])
level=s[i];
b[i]=level;
}
int ans=0;
for(int i=0;i<n;i++)
ans+=min(a[i],b[i])-p[i];
cout<<ans<<endl;
}
return 0;
}