题解:P6063 [USACO05JAN] The Wedding Juicer G
本题思路
我们只需要把每个柱子上的果汁水位设为最高果汁水位,再向四周释放果汁就可以了。最后的答案就是所有位置水的高度减原高度的和。
本题步骤
- 我们先找到最高的一个柱子,将最高水位设为这根柱子的高度。
- 将每个柱子上的果汁设为最高水位。
- 在四周的果汁都会流出去,所以四周果汁最高水位设为 \(0\)。
- 把四周的柱子放入小根堆。
- 开始广搜。
- 输出答案。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+3;
int watter_max,ans=0;
int pic[N][N],G[N][N];
int fx[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
priority_queue<pair<int,int> >q;
int main(){
int n,m;
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>pic[i][j];
G[i][j]=pic[i][j];
watter_max=max(watter_max,pic[i][j]);
if(i==1||i==n||j==1||j==m) q.push(make_pair(i,j));
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if((i==1||i==n||j==1||j==m)&&pic[i][j]>=0) continue;
if((i==1||i==n||j==1||j==m)&&pic[i][j]<0) G[i][j]=0;
if(i!=1&&i!=n&&j!=1&&j!=m) G[i][j]=watter_max;
}
}//初始化
while(!q.empty()){
int x=q.top().first;
int y=q.top().second;
q.pop();
for(int i=0;i<4;i++){
int xx=x+fx[i][0],yy=y+fx[i][1];
if(xx<1||yy<1||xx>n||yy>m) continue;
if(G[xx][yy]<=G[x][y]) continue;
if(G[x][y]>pic[xx][yy]){
G[xx][yy]=G[x][y];
q.push(make_pair(xx,yy));
}
if(G[x][y]<=pic[xx][yy]){
G[xx][yy]=pic[xx][yy];
q.push(make_pair(xx,yy));
}
}
}//广搜
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans+=G[i][j]-pic[i][j];
}
}//计算答案
cout<<ans;
}
多倍经验 SP212。