当前位置: 首页 > news >正文

It's not a Bug, It's a Feature! --POJ 1482

1、题目类型:BFS、位运算、优先队列。

2、解题思路:深度搜索。题意,维修一台有病毒的电脑,有 n 种病毒、m 种补丁包,每种补丁包必需以基于当前电脑的某些条件(如必需在电脑上面存在某种病毒、不存在某种病毒等等),在满足当前条件的情况下,补丁包可以消除某些病毒,但同时也可能产生新的病毒。要求找出删除所有病毒的最短时间。步骤,(1)将给出的补丁包信息记录在结构体 Pragram 中;(2)当前电脑的所用时间、病毒状态用结构体Node 型记录下来,由于其病毒数目小于20,所以可以用 int 类型的各位标示(“+ ”表示为0、“-”表示为1;(3)BFS搜索满足补丁状态条件的Node进入优先队列,优先队列按照其用时排序,这样又有利于寻找最短时间,直到找到结果状态输出,否则补丁包更新不成功。

3、注意事项:注意优先队列priority_queue的重载;check()判断状态条件中注意“0” 即无关的条件处理。

4、实现方法:


  
#include < iostream >
#include
< queue >
using namespace std;

struct Pragram
{
int time;
char start[ 21 ],end[ 21 ];
};

struct Node
{
int t,state;
bool operator < ( const Node A) const
{
return t > A.t;
}
};

Pragram P[
101 ];
int n,m,flag,ans;
int vis[ 1148576 ];

// k 表示第k个补丁、state表示当前状态、&val 表示补丁后状态
bool Check( int k, int state, int & val)
{
int i,cnt0 = 0 ,cnt1 = 0 ;
for (i = 0 ;i < n;i ++ )
{
if (P[k].start[i] != ' 0 ' )
{
if (P[k].start[i] == ' + ' )
{
if ((state & ( 1 << i)))
return false ;
}
else
{
if ((state & ( 1 << i)) == 0 )
return false ;
}
}
}
val
= 0 ;
for (i = 0 ;i < n;i ++ )
{
if (P[k].end[i] == ' 0 ' )
{
if (state & ( 1 << i))
{
val
^= ( 1 << i);
}
}
else if (P[k].end[i] == ' - ' )
{
val
^= ( 1 << i);
}
}
return true ;
}

// + 表示为0、-表示为1
void BFS( int ca)
{
int i;
flag
= 0 ,ans = 10000000 ; // 初始化标示变量
priority_queue < Node > Q;
Node tmp;
tmp.state
= 0 ;
tmp.t
= 0 ;
Q.push(tmp);
vis[
0 ] = 1 ;
while ( ! Q.empty())
{
tmp
= Q.top();
Q.pop();
if (tmp.t > ans)
break ;
if (tmp.state == (( 1 << n) - 1 )) // 终止状态
{
cout
<< " Product " << ca << endl;
cout
<< " Fastest sequence takes " << tmp.t << " seconds. " << endl << endl;
return ;
}
for (i = 0 ;i < m;i ++ )
{
int Estate;
if (Check(i,tmp.state,Estate))
{
if ( ! vis[Estate])
{
Node N;
N.state
= Estate;
N.t
= tmp.t + P[i].time;
Q.push(N);
vis[Estate]
= N.t;
}
else if (vis[Estate] > (tmp.t + P[i].time))
{
Node N;
N.state
= Estate;
N.t
= tmp.t + P[i].time;
Q.push(N);
vis[Estate]
= N.t;
}
}
}
}
if ( ! flag)
{
cout
<< " Product " << ca << endl;
cout
<< " Bugs cannot be fixed. " << endl << endl;
}
else
{
cout
<< " Product " << ca << endl;
cout
<< " Fastest sequence takes " << ans << " seconds. " << endl << endl;
}
}

int main()
{
int i,ca = 1 ;
while (cin >> n >> m)
{
if (n == 0 && m == 0 )
break ;
memset(vis,
0 , sizeof (vis));
for (i = 0 ;i < m;i ++ )
{
cin
>> P[i].time >> P[i].start >> P[i].end;
}
BFS(ca
++ );
}
return 0 ;
}

 

转载于:https://www.cnblogs.com/yongze103/archive/2010/10/18/1854002.html

相关文章:

  • postgresql 死锁问题解决记录
  • WCF Data Services客户端访问
  • css知多少(4)——解读浏览器默认样式
  • Breakthrough—JavaScript基础
  • 辛苦几个小时,终于装完主机了
  • 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2封装(十八)
  • android httpClient 支持HTTPS的2种处理方式
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇阶段总结与WinForm篇展望...
  • 如何开启常用端口和其他端口
  • C# HttpRequest基础连接已经关闭: 接收时发生意外错误
  • 学习笔记----安装nginx
  • 从零开始学android开发-查看sqlite数据库
  • 大数据的导入与导出,可以用到两个方法
  • 各种类型Android源代码
  • 捷径系列:NSDate
  • [笔记] php常见简单功能及函数
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【RocksDB】TransactionDB源码分析
  • 07.Android之多媒体问题
  • 345-反转字符串中的元音字母
  • Joomla 2.x, 3.x useful code cheatsheet
  • LeetCode算法系列_0891_子序列宽度之和
  • MySQL-事务管理(基础)
  • python 装饰器(一)
  • SpringCloud集成分布式事务LCN (一)
  • vue的全局变量和全局拦截请求器
  • 包装类对象
  • 力扣(LeetCode)56
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 中文输入法与React文本输入框的问题与解决方案
  • 【干货分享】dos命令大全
  • NLPIR智能语义技术让大数据挖掘更简单
  • 如何用纯 CSS 创作一个货车 loader
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (12)Hive调优——count distinct去重优化
  • (9)STL算法之逆转旋转
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)获取字符编码的类
  • (C)一些题4
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (正则)提取页面里的img标签
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)Scala的“=”符号简介
  • (转)scrum常见工具列表
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET Core WebAPI中封装Swagger配置
  • .sh
  • /*在DataTable中更新、删除数据*/