• POJ 2227 The Wedding Juicer (BFS+优先队列)


    题意:给定n*m地图,其中高度不同,问最多能存多少水(和木桶一样,最外层不能存水)。

    思路:黑书上有讲,从最外围的点开始加入到队列,每次取高度最小的点,然后看其子结点,如果高度大于自己那么加入队列,否则填充水量和自己高度相同,加入队列,可以证明这样做可以得到最优解,因为开始时最外围的点是不能够存水的,因此这个算法就是从"外"(高度最小)向"里"找,依次删除不能够存水的节点即可。

    PS:  这个题做的太戏剧性了,敲完代码,发现机房机子中毒,exe文件没法执行(又要重装了.....),不能Debug,编译一遍检查无误,然后狠狠心裸交,结果有个变量未定义,返回RE...改完再交,结果AC........Ft,本来测试数据都不曾想过的...人品爆发了...

    #include <iostream>
    #include
    <cstdio>
    #include
    <algorithm>
    #include
    <memory.h>
    #include
    <cmath>
    #include
    <bitset>
    #include
    <queue>
    #include
    <vector>
    usingnamespace std;

    constint BORDER = (1<<20)-1;
    constint MAXSIZE =37;
    constint MAXN =400;
    constint INF =1000000000;
    #define CLR(x,y) memset(x,y,sizeof(x))
    #define ADD(x) x=((x+1)&BORDER)
    #define IN(x) scanf("%d",&x)
    #define OUT(x) printf("%d\n",x)
    #define MIN(m,v) (m)<(v)?(m):(v)
    #define MAX(m,v) (m)>(v)?(m):(v)
    #define ABS(x) ((x)>0?(x):-(x))

    #define SET_NODE(no,a,b,c) {no.x=a;no.y=b;no.h=c;}

    typedef
    struct{
    int x,y;
    int h;
    }Node;
    booloperator<(const Node& a,const Node& b)
    {
    return a.h > b.h;
    }

    Node t_node,node;
    int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
    int n,m,ans;
    int arr[MAXN][MAXN];
    bool visit[MAXN][MAXN];

    bool _is(constint& x,constint& y)
    {
    if(x <0|| x >= n)
    returnfalse;
    if(y <0|| y >= m)
    returnfalse;
    returntrue;
    }
    int init()
    {
    ans
    =0;
    CLR(visit,
    0);
    return0;
    }
    int input()
    {
    for(int i =0; i < n; ++i)
    for(int j =0; j < m; ++j)
    IN(arr[i][j]);
    return0;
    }
    int bfs()
    {
    int i,j,x,y,h,a,b;
    int corner[4][2] = {{0,0},{0,m-1},{n-1,0},{n-1,m-1}};
    priority_queue
    <Node> que;
    while(!que.empty())
    que.pop();
    for(i =0; i <4; ++i)
    {
    visit[corner[i][
    0]][corner[i][1]] =true;
    SET_NODE(t_node,corner[i][
    0],corner[i][1],
    arr[corner[i][
    0]][corner[i][1]]);
    que.push(t_node);
    }
    for(i =1; i < n-1; ++i)
    {
    SET_NODE(t_node,i,
    0,arr[i][0]);
    que.push(t_node);
    visit[i][
    0] =true;
    SET_NODE(t_node,i,m
    -1,arr[i][m-1]);
    que.push(t_node);
    visit[i][m
    -1] =true;
    }
    for(j =0; j < m; ++j)
    {
    SET_NODE(t_node,
    0,j,arr[0][j]);
    que.push(t_node);
    visit[
    0][j] =true;
    SET_NODE(t_node,n
    -1,j,arr[n-1][j]);
    que.push(t_node);
    visit[n
    -1][j] =true;
    }
    /* while loop */
    while(!que.empty())
    {
    node
    = que.top();
    que.pop();
    a
    = node.x;
    b
    = node.y;
    h
    = node.h;
    for(i =0; i <4; ++i)
    {
    x
    = a + dir[i][0];
    y
    = b + dir[i][1];
    if(_is(x,y) &&!visit[x][y])
    {
    if(arr[x][y] < h)
    {
    ans
    += h - arr[x][y];
    SET_NODE(t_node,x,y,h);
    que.push(t_node);
    }
    else
    {
    SET_NODE(t_node,x,y,arr[x][y]);
    que.push(t_node);
    }
    visit[x][y]
    =true;
    }
    }
    }
    return ans;
    }
    int work()
    {
    bfs();
    OUT(ans);
    return0;
    }
    int main()
    {
    while(scanf("%d%d",&m,&n)!=EOF)
    {
    init();
    input();
    work();
    }
    return0;
    }

  • 相关阅读:
    Binder机制1---Binder原理介绍
    ShareSDK for iOS 2.9.0已经公布
    TCP/IP数据包结构具体解释
    苹果ipa软件包破解笔记
    自己定义对象的监听方式
    强大的PropertyGrid
    matlab中plot使用方法
    fopen 參数具体解释
    leetcode:linked_list_cycle_II
    AssemblyInfo.cs文件的作用
  • 原文地址:https://www.cnblogs.com/lvpengms/p/1719448.html
Copyright © 2020-2023  润新知