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...
  • scorpiocj
  • scorpiocj
  • 2011年07月09日 23:23
  • 461

codeforces 78E - Evacuation 最大流

不能一一贪心暴搜,因为每个人的决策会对其他人产生影响 必须用能考虑到全局的做法 最大,全局,想到最大流 初始化dp[t][x][y][nx][ny] 表示在t时间内能从(x,y)到达(nx,ny...
  • Jackyguo1992
  • Jackyguo1992
  • 2013年07月16日 11:10
  • 997

关于Codeforce

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike M...
  • Acuper
  • Acuper
  • 2016年07月22日 10:04
  • 1539

Codeforce数据结构目录

233333
  • QAQ__QAQ
  • QAQ__QAQ
  • 2016年11月09日 19:38
  • 529

大坑!Codeforce DP题总结(持续更新)

个人非常喜欢做DP题,因为DP题有着特殊的数学美感持续不断吸引着我
  • rrtyui
  • rrtyui
  • 2014年09月22日 23:25
  • 2247

codeforce 7C 扩展欧几里得算法

http://codeforces.com/problemset/problem/7/C
  • u013573047
  • u013573047
  • 2014年06月03日 21:19
  • 744

Codeforce 149D(区间dp+括号匹配)

链接:点击打开链接 题意:给一个给定括号序列,给该括号序列上色,上色有三个要求1.每个括号只有三种情况,不上色,上红色,上蓝色,2.每对括号必须只能给其中的一个上色3.相邻的两个不能上同色,可以都不上...
  • stay_accept
  • stay_accept
  • 2016年05月07日 15:22
  • 724

codeforce(找规律的简单题)

D. Prizes, Prizes, more Prizes time limit per test 2 seconds memory limit per test 256 megabytes...
  • ACMer_hades
  • ACMer_hades
  • 2015年04月22日 21:00
  • 950

codeforce比赛规则介绍(转)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirz...
  • qq_31736627
  • qq_31736627
  • 2016年09月24日 10:23
  • 627

Codeforces 题目合集+分类+蒟蒻的代码 【Updating...】【262 in total】

934A - A Compatible Pair             暴力               https://paste.ubuntu.com/p/nwzfpRK3NJ/934B - A...
  • my_sunshine26
  • my_sunshine26
  • 2017年07月29日 23:42
  • 1554
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforce 78E
举报原因:
原因补充:

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