博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2761 软件补丁问题
阅读量:5151 次
发布时间:2019-06-13

本文共 1828 字,大约阅读时间需要 6 分钟。

每种错误只有有与没有两种情况

错误数只有二十

我们就可以二进制压缩一下状态

而且对于错误情况相同的情况,只要遍历到了一次,那么这种情况的最优解就已经出粗来了

但是

题目中是有可能有环的

bfs就可以了

利用二进制储存一下状态

#include
#include
#include
#include
using namespace std;int b1[102],b2[102],f1[101],f2[102];int cost[102];char in[102];queue
q;bool inque[1048577];int dis[1048577];int main(){ cin.sync_with_stdio(false); int n,m; cin>>n>>m; /*if(n==0) { //printf("0"); cout<<"0"; return 0; }*/ int base,len; for(int i=1;i<=m;i++) { cin>>cost[i]; base=1; cin>>in; for(int j=0;in[j]!='\0';j++) { switch(in[j]) { case '+':b1[i]+=base;break; case '-':b2[i]+=base;break; case '0':break; } base*=2; } base=1; cin>>in; for(int j=0;in[j]!='\0';j++) { switch(in[j]) { case '-':f1[i]+=base;break;//二进制储存一下状态了,(#^.^#) case '+':f2[i]+=base;break; case '0':break; } base*=2; } } base=1; int begin=0; for(int i=1;i<=n;i++) { begin+=base; base*=2; } for(int i=0;i<=begin;i++) dis[i]=0x7ffffff; q.push(begin); dis[begin]=0; inque[begin]=true; int pass,nxt; while(!q.empty())//bfs { pass=q.front(); q.pop(); inque[pass]=false; for(int i=1;i<=m;i++) { if((pass&b1[i])!=b1[i])//按照题目模拟 continue; if((pass&b2[i])!=0) continue; int ha=pass&f1[i];//水水地打补丁 nxt=pass-ha; nxt=nxt|f2[i];//再讲f2打上去 if(dis[nxt]

转载于:https://www.cnblogs.com/Lance1ot/p/8693187.html

你可能感兴趣的文章
linux一些基本操作-防火墙操作
查看>>
System类
查看>>
iOS 学习 - 26.git 版本迁移
查看>>
BZOJ.4903.[CTSC2017]吉夫特(Lucas DP)
查看>>
表单验证
查看>>
tableView
查看>>
Happy Great BG-卡精度
查看>>
Xamarin Visual Studio不识别JDK路径
查看>>
php 如何生成静态页
查看>>
[C++] 函数的概念
查看>>
菜鸟“抄程序”之道
查看>>
DispatcherServlet详解
查看>>
Python11/20---MySql的数据类型/约束条件
查看>>
Ubuntu下关闭防火墙
查看>>
wxss与rpx
查看>>
jQuery基本过滤选择器
查看>>
TCP/IP 邮件的原理
查看>>
ecos新命令
查看>>
w3m常用快捷键
查看>>
【Unity 3D】学习笔记四十一:关节
查看>>