题解:P6063 [USACO05JAN] The Wedding Juicer G

本题思路

我们只需要把每个柱子上的果汁水位设为最高果汁水位,再向四周释放果汁就可以了。最后的答案就是所有位置水的高度减原高度的和。

本题步骤

  1. 我们先找到最高的一个柱子,将最高水位设为这根柱子的高度。
  2. 将每个柱子上的果汁设为最高水位。
  3. 在四周的果汁都会流出去,所以四周果汁最高水位设为 \(0\)
  4. 把四周的柱子放入小根堆。
  5. 开始广搜。
  6. 输出答案。

代码

#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

posted @ 2025-03-07 17:47  Eden_star  阅读(19)  评论(0)    收藏  举报
//雪花飘落效果