这题目很是坑爹,各种坑爹,一开始SF了不止多少次,后来发现是Type的不仅仅是1,2.而是到1000,还有给出的图 是500 * 500的,可是直接去搜索一直超时,想不通,题目给的是3000ms,早就够了可是不行,后来再改,又SF,不能忍了,就YY了一下,用优先队列把
总是做算法,不如来个陶冶情操的文章一篇: http://www.sanwen.net/subject/3628849/
题意:
给出一个矩阵,每一个元素代表一台电脑,每台电脑有一个值,这个值为了区分题目要求是负的,代表它能够抵御病毒几天,已经被一种病毒感染的电脑不会再被其它病毒感染,但是它无法阻拦其它病毒去感染其它电脑,然后有两种病毒{1,2,3,....1000}种的任意两种,Type类型值小的先去感染,但是肯定不同种类,第一天有两台电脑,病毒是可以传染的,第一天只能感染抵御一天的电脑,第二天才能感染只能抵御2天以及2天以下的,第三天能感染只能抵御3天以及3天以下的电脑,所有电脑被感染后 会有 Q个提问, 每一个提问 会问你 此病毒 最终感染了几台电脑
YY了一把优先队列,因为搜索一直超时改了SF所以感觉就是要优化, 按题意 很明显,抵御天数少的 放前面, 如果两台电脑抵御天数一样,病毒Type值小的 先去进行感染,这样优先条件就好了,然后 搜索一下,又举了 几个案例 过了 就交了一把 发现 RE,感觉自己程序写的没问题 也不会爆栈,所以说这道题目坑, 他没有明确的说明Q的范围,但是如果你开的Q的数组小于10^6的话,就是RE,所以这道题目坑点 数不胜数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <string>
#define ll long long
using namespace std;
#define inf 10000000
int n,m;
int dir[4][2]={0,-1,0,1,1,0,-1,0};
int ans[5000000 + 5];
int mp[1000 + 5][1000 + 5];
void clear() {
memset(ans,0,sizeof(ans));
memset(mp,0,sizeof(mp));
}
typedef struct Node {
int level;
int type;
int sx,sy;
friend bool operator< (Node n1, Node n2) {
if(n1.level == n2.level)
return n1.type > n2.type;
return n1.level > n2.level;
}
};
priority_queue<Node> q;
void dfs() {
Node s,e;
while(!q.empty()) {
s = q.top();
q.pop();
int tmp = -inf;
for(int i=0;i<4;i++) {
int dx = s.sx + dir[i][0];
int dy = s.sy + dir[i][1];
if(dx <0 || dx >=n || dy<0 || dy>=m)continue;
if(mp[dx][dy] > 0)continue;
if(mp[dx][dy] + s.level >= 0) {
e.sx = dx;
e.sy = dy;
e.type = s.type;
ans[s.type]++;
e.level = s.level;
mp[dx][dy] = s.type;
q.push(e);
}
else {
if(mp[dx][dy] > tmp)
tmp = mp[dx][dy];
}
}
if(tmp != -inf) {
s.level = -tmp;
q.push(s);
}
}
}
int main() {
while(scanf("%d %d",&n,&m) == 2) {
clear();
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
scanf("%d",&mp[i][j]);
if(mp[i][j] > 0) {
Node node;
node.sx = i;
node.sy = j;
node.type = mp[i][j];
node.level = 1;
q.push(node);
ans[mp[i][j]]++;
}
}
}
dfs();
int Q;
scanf("%d",&Q);
for(int i=0;i<Q;i++) {
int a;
scanf("%d",&a);
printf("%d\n",ans[a]);
}
}
return 0;
}
ZOJ2849 Attack of Panda Virus 熊猫烧香~~ 优先队列+搜索,布布扣,bubuko.com
ZOJ2849 Attack of Panda Virus 熊猫烧香~~ 优先队列+搜索
原文:http://blog.csdn.net/yitiaodacaidog/article/details/21819673