• E


    题目链接:

    E - Emptying the Baltic

     Kattis - emptyingbaltic 

    题目大意:n*m的地图, 每个格子有一个海拔高度, 当海拔<0的时候有水。 现在在(x, y)最深处放一个抽水机, 问最多能抽多少水,周围8个方向的水会流过来。

    具体思路:对于每一个海拔小于0的点,判断这个点周围有水的最低高度。然后将这些高度加起来就可以了。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 # define ll long long
     4 # define inf 0x3f3f3f3f
     5 const int maxn = 500+100;
     6 int n,m;
     7 int a[maxn][maxn];
     8 int vis[maxn][maxn];
     9 int f[2][8]= {{1,-1,0,0,1,-1,1,-1},
    10     {0,0,1,-1,-1,1,1,-1}
    11 };
    12 struct node
    13 {
    14     int x,y,dep;
    15     node() {}
    16     node(int xx,int yy,int zz)
    17     {
    18         x=xx;
    19         y=yy;
    20         dep=zz;
    21     }
    22     bool friend operator < (node t1,node t2)
    23     {
    24         return t1.dep>t2.dep;
    25     }
    26 };
    27 bool judge(int x,int y)
    28 {
    29     if(x>=1&&x<=n&&y>=1&&y<=m)
    30         return true;
    31     return false;
    32 }
    33 ll spfa(int x,int y)
    34 {
    35     priority_queue<node>q;
    36     q.push(node(x,y,a[x][y]));
    37     vis[x][y]=1;
    38     ll ans=fabs(a[x][y]);
    39     while(!q.empty())
    40     {
    41         node top=q.top();
    42         q.pop();
    43         for(int i=0; i<8; i++)
    44         {
    45             int tx=top.x+f[0][i];
    46             int ty=top.y+f[1][i];
    47             if(judge(tx,ty)&&vis[tx][ty]==0&&a[tx][ty]<0)
    48             {
    49                 vis[tx][ty]=1;
    50                 int tmp=max(a[tx][ty],top.dep);
    51                 ans+=(-tmp);
    52                 q.push(node(tx,ty,tmp));
    53             }
    54         }
    55     }
    56     return ans;
    57 }
    58 int main()
    59 {
    60     scanf("%d %d",&n,&m);
    61     for(int i=1; i<=n; i++)
    62     {
    63         for(int j=1; j<=m; j++)
    64         {
    65             scanf("%d",&a[i][j]);
    66         }
    67     }
    68     int x,y;
    69     scanf("%d %d",&x,&y);
    70    ll ans=spfa(x,y);
    71     printf("%lld
    ",ans);
    72     return 0;
    73 }
  • 相关阅读:
    HDU 1385 Minimum Transport Cost
    TOJ 3488 Game Dice
    TOJ 1717 WOJ
    POJ 2553 The Bottom of a Graph
    TOJ 1836 Play on Words
    利用OpenCV建立视差图像
    分享一个PyTorch医学图像分割开源库
    WACV 2021 论文大盘点-图像分割篇
    SolidWorks动画教程(1):简单动画制作
    VS2013安装及破解教程
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10650712.html
Copyright © 2020-2023  润新知