codeforce 78E

原创 2016年08月29日 20:28:52

思路:

先用BFS找出炸弹到各个地方的时间

再用BFS依次找出每个人(从它所在坐标 )在规定时间内能走到的所有坐标,以及到相应位置的时间
然后比较每个坐标,比较人所到的时间和炸弹到的时间,前者要比后者小才能通过,看这些合格的点中有没有救生胶囊,有的话就OK(这里的处理我代码上还有错,等有时间再改。。)


正规的做法是先用BFS建图,然后用最大流计算


#include <stdio.h>
#include <queue>
#include <string.h>
#include <iostream>
#include <memory.h>

using namespace std;

#define mp make_pair
typedef pair<int, int> pii;

int resc1[11][11];
int suv = 0;
int scie1[11][11];

char scie[11][11], resc[11][11];
int dist[11][11];
int seen[11][11];
int g[910][910];

int resccnt[11][11];
int sciecnt, ct;

int vis[1000];


int n, t;



const int INF = 10000;
queue<pii> fila;

void bfs(int dst[11][11])
{
    memset(seen, 0, sizeof(seen));
    pii rea = fila.front();
    dst[rea.first][rea.second] = 0;

    while(!fila.empty())
    {
        pii cur = fila.front();
        fila.pop();

        seen[cur.first][cur.second] = 1;

        for(int dx = -1; dx <= 1; dx++)
        {
            for(int dy = -1; dy <= 1; dy++)
            {
                if(dx + dy == 0 || dx * dy != 0)
                {
                    continue;
                }

                int nx = cur.first + dx, ny = cur.second + dy;

                if(nx < 0 || nx >= n || ny < 0 || ny >= n || scie[nx][ny] == 'Y' || seen[nx][ny])
                {
                    continue;
                }

                dst[nx][ny] = dst[cur.first][cur.second] + 1;

                if(dst == dist || dst[nx][ny] < dist[nx][ny])
                {
                    fila.push(mp(nx, ny));
                }
            }
        }
    }
}

void create(int x, int y)
{
    int mydist[11][11];

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            mydist[i][j] = INF;
        }
    }

    mydist[x][y] = 0;
    fila.push(mp(x, y));
    bfs(mydist);


    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {

            if(mydist[i][j] <= min(t, dist[i][j]) && scie[i][j] != 'Y' && scie[i][j] != 'Z')
            {


                if(resc1[i][j] > 0 && scie1[x][y]>0)
                {
                    if(scie1[x][y]<=resc1[i][j]){
                        suv += scie1[x][y] ;
                        resc1[i][j] -= scie[x][y]-'0';
                        scie1[x][y] -= scie[x][y]-'0';
                        return;

                    }else{

                        suv +=  resc1[i][j];
                        scie1[x][y] -= resc1[i][j];
                        resc1[i][j] = 0;

                    }

                }

            }
        }

    }


}

int main()
{
    scanf("%d %d", &n, &t);

    for(int i = 0; i < n; i++)
    {
        scanf("%s", scie[i]);
    }

    for(int i = 0; i < n; i++)
    {
        scanf("%s", resc[i]);
    }

    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            dist[i][j] = INF;

            if(scie[i][j] == 'Z')
            {
                fila.push(mp(i, j));
            }
        }
    }

    bfs(dist);

    memset(resc1, 0, sizeof(resc1));
    memset(scie1, 0, sizeof(resc1));

    ct = 0;

    for(int i = 0; i < n; i++)     //record sum of resc point == 1+5
    {
        for(int j = 0; j < n; j++)
        {
            resccnt[i][j] = ct;

            if(resc[i][j] > '0' && resc[i][j] <= '9')
            {
                ct += resc[i][j] - '0';
                resc1[i][j] = resc[i][j] - '0';
            }

            if(scie[i][j] > '0' && scie[i][j] <= '9'){
                scie1[i][j] = scie[i][j] - '0';
            }


        }
    }



    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(scie[i][j] > '0' && scie[i][j] <= '9')
            {
                create(i, j);
            }
        }
    }




    cout << suv << endl;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Codeforces 78E Evacuation

构图的思路与POJ 2391是一样的,对于从一个初级源点s出发的流,如果可到达的点是受限制的,可以先把这些受限制的点都找出来,拆点拆成i->i',然后,s向i''连边,最后,超级源点S向每个初级源点s...

解析xml http://topic.csdn.net/u/20070409/19/6BAD2D5B-D78B-4CA1-81C7-F687D7E9FDE0.html

使用JDOM解析XML一、前言    JDOM是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初,JDOM作为一个开放源代码项目正式开始研发。JDOM...

codeforce#420 E. Okabe and El Psy Kongroo(图论+矩阵快速幂)

题目链接E. Okabe and El Psy Kongroo分析首先对于坐标为 (x,y)(x,y) 的点,设 f(x,y)f(x,y) 表示从原点到 (x,y)(x,y) 的路径不难得到递推公式 ...

Codeforce Round #379 (Div. 2) 734 E Anton and Tree(tree 缩点 树的直径 )

题目链接734 E Anton and Tree 题目大意:一棵树上有两种不同颜色的节点,你有一种操作,一次可以改变与vv相连的同种颜色联通快的颜色,问最少多少次操作可以把树染成同样的颜色分析看了题...

codeforce678E

#include #include #include #include using namespace std; #define MAX 18 double d[1

codeforce-24e 解题报告

Berland collider time limit per test 3 seconds memory limit per test 256 megabytes ...

【CodeForce 710E】Generate a String

Description 抽象题意:给出n(目标字符串有n个‘a’),x(增加或删除一个‘a’需要多少秒),y(复制并粘贴当前的字符串需要多少秒) 求用最少的时间,生成n个‘a’; zscod...
  • HOWARLI
  • HOWARLI
  • 2016年10月28日 19:44
  • 215

【数论】codeforce711E ZS and The Birthday Paradox

题目大意: 给n和k。 求2^n天,k个人,其中至少两人同一天生日的概率。 1 ≤ n ≤ 1018, 2 ≤ k ≤ 1018 输出分子和分母 MOD 1e6+3 求MOD前,...

codeforce 479E - Riding in a Lift

题目链接:http://codeforces.com/problemset/problem/417/C 题目大意:所有参加者被分成n个小组,两支球队只能打一次。构造出每个队击败其他球队恰好k次的...

Codeforce 364E 二维分治 包含K个1的 子矩阵个数

题目链接:http://codeforces.com/problemset/problem/364/E   #include #include #include #include #include ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforce 78E
举报原因:
原因补充:

(最多只允许输入30个字)