uva 1442 Cav(左右各扫描一次)

来源:互联网 发布:工控 java 编辑:程序博客网 时间:2024/05/17 20:35

题目大意:一个洞穴的宽度为n(n<=10^6)个片段组成。第i处的地面高度为pi,顶高度为si(0=<pi<si<=1000),要求在洞中存放尽量多的燃料(液体),使得燃料的位置不会碰到顶,但可以无限接近。

方法:设每个片段中燃料的高度为l,初始值为是s[0]或s[n-1],如果当前片段的地面高度pi>l,则l=pi,顶高度si<l,则l=si,把每个片段的l存在数组中。从右往左扫一遍,再从左往右扫一遍,最后用片段中较小的l减去pi即该片段的燃料,所有相加,即为所求。

AC代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<set>using namespace std;int p[1000005],s[1000005],a[1000005],b[1000005];int main(){    int t,i,ans,l,n;    cin>>t;    while(t--)    {        cin>>n;        for(i=0;i<n;i++)        {            cin>>p[i];        }        for(i=0;i<n;i++)        {            cin>>s[i];        }        l=s[0];        for(i=0;i<n;i++)        {            if(l<p[i])            {                l=p[i];            }            if(l>s[i])            {                l=s[i];            }            a[i]=l;        }        l=s[n-1];        for(i=n-1;i>=0;i--)        {            if(l<p[i])            {                l=p[i];            }            if(l>s[i])            {                l=s[i];            }            b[i]=l;        }        ans=0;        for(i=0;i<n;i++)        {            ans+=min(a[i],b[i])-p[i];        }        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击