原题链接:https://vjudge.net/problem/UVA-10366
分类:贪心法
备注:模拟,细节
显然如果两边最高高度不等,一定会从最高高度低的那一边出去,然后再考虑下什么时候会同时左右流水的情况即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int l,r,lef[maxn],rig[maxn];
int lpos,rpos,maxL,maxR;
int main(void){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(~scanf("%d%d",&l,&r)&&l){
l/=-2; r/=2;
maxL=maxR=0;
for(int i=l;i>=0;i--){
scanf("%d",&lef[i]);
if(maxL<=lef[i]){
maxL=lef[i];
lpos=i;
}
}
for(int i=0;i<=r;i++){
scanf("%d",&rig[i]);
if(maxR<rig[i]){
maxR=rig[i];
rpos=i;
}
}
int ans=0,sumL=0,sumR=0,tmph;
if(maxL==maxR){
tmph=lef[l];
for(int i=l;i>lpos;i--){
sumL+=tmph;
tmph=max(tmph,lef[i-1]);
}
tmph=rig[r];
for(int i=r;i>rpos;i--){
sumR+=tmph;
tmph=max(tmph,rig[i-1]);
}
ans=maxL*2*(rpos+lpos+1)+min(sumL,sumR)*2*2;
}else{
int minh=min(maxL,maxR);
int li=0,ri=0;
while(l>li&&lef[li]<minh)li++;
while(r>ri&&rig[ri]<minh)ri++;
if(maxL>maxR){//ri==rpos
tmph=rig[r];
for(int i=r;i>ri;i--){
sumR+=tmph; tmph=max(tmph,rig[i-1]);
}
for(int i=li;lef[i]<=minh;i++)
sumL+=minh;
if(sumL>sumR)ans=sumR*2;
else ans=sumL+sumR;
}else{//li==lpos
tmph=lef[l];
for(int i=l;i>lpos;i--){
sumL+=tmph; tmph=max(tmph,lef[i-1]);
}
for(int i=ri;rig[i]<=minh;i++)
sumR+=minh;
if(sumR>sumL)ans=sumL*2;
else ans=sumL+sumR;
}
ans=ans*2+(li+ri+1)*minh*2;
}
printf("%d\n",ans);
}
return 0;
}