ZOJ 2849-Attack of Panda Virus

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2849

题意:给定当前网络的病毒感染状态,求最终各编号病毒所能感染的电脑数。

给定一张N*M大小的地图(N,M<=500)。

地图内有T个为正数的点,表示初始病毒所在位置以及对应病毒的编号。

剩下的负数点表示所在位置电脑的安全等级。

求最终状态各病毒所能感染的电脑数目。

感染规则如下:

1、电脑只能被一种病毒感染。

2、存在一个天数d,只有(d+当前位置的电脑安全等级)>=0时该电脑才能被感染。

3、编号小的病毒优先行动,只有低编号的病毒不能再进行感染时才轮到髙编号的病毒行动。

思路:优先队列直接搞,结构体存下当前位置信息外加一个天数,优先队列先按天数排,后按病毒编号排。

注意在天数更改的时候不能让天数++,而应变为最低有效天数,不然就T。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define maxn 505
#define LL long long
#define PI 3.141592653
struct node
{
    int gl;
    int x,y;
    int d;
    bool operator < (const node &a) const
    {
        if(a.d!=d) return d<a.d;
        return gl>a.gl;
    }
};
priority_queue<node>q;
int mp[maxn][maxn];
bool vis[maxn][maxn];
int ans[maxn*maxn];
int n,m;
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
void bfs()
{
    while(!q.empty())
    {
        node f=q.top();
//        cout<<f.x<<" "<<f.y<<" "<<f.gl<<" "<<f.d<<endl;
        q.pop();
        int flag=-1000000;
        for(int i=0;i<4;i++)
        {
            int dx=f.x+xx[i];
            int dy=f.y+yy[i];
            if(dx>=0&&dx<n&&dy>=0&&dy<m&&mp[dx][dy]&&vis[dx][dy]==false)
            {
//                cout<<f.x<<" "<<f.y<<" "<<f.gl<<endl;
                if(mp[dx][dy]>=f.d)
                {
                    vis[dx][dy]=true;
                    node nx;
                    nx.gl=f.gl;
                    nx.x=dx;
                    nx.d=f.d;
                    nx.y=dy;
                    q.push(nx);
                    ans[f.gl]++;
                }
                else
                {
                    flag=max(flag,mp[dx][dy]);
                }
            }
        }
        if(flag!=-1000000)
        {
            f.d=flag;
            q.push(f);
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        memset(ans,0,sizeof(ans));
        memset(vis,false,sizeof(vis));
        while(!q.empty()) q.pop();
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            cin>>mp[i][j];
            if(mp[i][j]>0)
            {
                vis[i][j]=true;
                node tt;
                tt.gl=mp[i][j];
                tt.x=i;
                tt.y=j;
                tt.d=-1;
                q.push(tt);
                ans[tt.gl]++;
            }
        }

        bfs();

        int qu;
        cin>>qu;
        while(qu--)
        {
            int id;
            cin>>id;
            cout<<ans[id]<<endl;
        }
    }
    return 0;
}
时间: 2024-11-10 13:11:58

ZOJ 2849-Attack of Panda Virus的相关文章

[递推dp] zoj 3747 Attack on Titans

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 Attack on Titans Time Limit: 2 Seconds      Memory Limit: 65536 KB Over centuries ago, mankind faced a new enemy, the Titans. The difference of power between mankind and their newf

【ZOJ】3430 Detect the Virus

动态建树MLE.模仿别人的代码模板各种原因wa后,终于AC. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 515*70 8 #define NXTN 256 9 10 bool visit[515]; 11 char str[3005]; 12 unsigned

ZOJ 3747 Attack on Titans

Attack on Titans Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ID: 374764-bit integer IO format: %lld      Java class name: Main Over centuries ago, mankind faced a new enemy, the Titans. The difference of powe

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm

这个是转的。学完就删_(:з」∠)_

原文链接:http://blog.csdn.net/cc_again/article/details/25866971 好多dp:http://blog.csdn.net/cc_again/article/category/1261899 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见的.主要包括递推.背包.LIS(最长递增序列),LCS(最长公共子序列),下面针对这几种类型,推荐一下比较好的学习资料和题目. 1.递推: 递推一般形式比较单一,从前往后,

Security arrangements for extended USB protocol stack of a USB host system

Security?arrangements for a universal serial bus (USB) protocol stack of a?USB host system are provided. The?security?arrangements prevent an unauthorized or suspicious?USB?device from communicating with the host system, detect suspicious activity or

PatentTips - Device virtualization and assignment of interconnect devices

BACKGROUND Standard computer interconnects, particularly for personal computers or workstations, may employ a bus such as Peripheral Component Interconnect ("PCI"), Industry Standard Architecture ("ISA"), or Extended ISA ("EISA&qu