P2761 软件补丁问题

文章目录

    • 题目描述
    • 题解:
    • 代码:

添加链接描述

题目描述

T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放了一批共 m
个补丁程序。每一个补丁程序都有其特定的适用环境,某个补丁只有在软件中包含某些错误而同时又不包含另一些错误时才可以使用。一个补丁在排除某些错误的同时,往往会加入另一些错误。

换句话说,对于每一个补丁 i,都有 2 个与之相应的错误集合 B1[i]和 B2[i],使得仅当软件包含 B1[i]中的所有错误,而不包含
B2[i]中的任何错误时,才可以使用补丁 i。补丁 i 将修复软件中的某些错误 F1[i],而同时加入另一些错误
F2[i]。另外,每个补丁都耗费一定的时间。

试设计一个算法,利用 T 公司提供的 m 个补丁程序将原软件修复成一个没有错误的软件,并使修复后的软件耗时最少。对于给定的 n 个错误和 m
个补丁程序,找到总耗时最少的软件修复方案。

输入格式

第 1 行有 2 个正整数 n 和 m,n 表示错误总数,m表示补丁总数,1<=n<=20, 1<=m<=100。

接下来 m 行给出了 m 个补丁的信息。每行包括一个正整数,表示运行补丁程序 i 所需时间,以及 2 个长度为 n
的字符串,中间用一个空格符隔开。

第 1 个字符串中,如果第 k 个字符 bk 为“+”,则表示第 k 个错误属于 B1[i],若为“-”,则表示第 k 个错误属于
B21[i],若为“0”,则第 k 个错误既不属于 B1[i]也不属于 B2[i],即软件中是否包含第 k 个错误并不影响补丁 i
的可用性。

第 2 个字符串中,如果第 k 个字符 bk为“-”,则表示第 k 个错误属于 F1[i],若为“+”,则表示第 k 个错误属于
F2[i],若为“0”,则第 k 个错误既不属于 F1[i]也不属于 F2[i],即软件中是否包含第 k 个错误不会因使用补丁i 而改变。

输出格式

程序运行结束时,将总耗时数输出。如果问题无解,则输出 0。

输入输出样例
输入

3 3
1 000 00-
1 00- 0-+
2 0-- -++

输出

8

题解:

样例分析:
圆圈表示还没修复,三角表示已修复
按照题目所给要求以及样例读入,我们可以得到以下分析
所采用的补丁分别为补丁1,2,1,3,1,2,1.
然后错误全部修复,总耗时为8
在这里插入图片描述
思路:
我是在刷网络流24题遇到的,看完后怎么想也想不到网络流。。。
感觉dp或者是最短路?
看了题解还真是,妙啊 ~ ~ (啥玩意还带这么坑人的)
还真是网络流24题中没网络流,老婆饼里没老婆
借用一张照片
在这里插入图片描述
第一步: 怎么和最短路联系到一起?
最短路无疑就是起点,终点,中间点,还有各点之间的线段
前三种点都是节点,在本题中节点就是错误修复的状态,起点就是全没修复,终点就是全修复了,每次修复一些错误或者新添一些错误,此时的修复状态就是当前状态。线段长度就是运行补丁的时间。我们在输入每一个补丁的时候,可以枚举一种状态,如果当前状态可以使用补丁,就算出使用补丁后的状态,前状态连一条边到后状态,长度也就是补丁时长
第二步: 状态压缩
n<=20,也就是最多20个错误,而每个错误只有修好和没修好俩状态,我们可以用01来表示(1表示没修好,0表示修好),这样20个错误其实就是一个01串,
比如bug3已经修好,1和2还未修好,那01串就是110,转化成十进制就是6。而初始状态(都未修好)为111,对应7。结束状态是都修好了为000,对应0。当有n个错误时,初始状态就是n个1,十进制也就是2n-1,即(1<<n)-1。结束就是0
第三步: 状态转移
补丁使用是有严格要求的,有些位置为1,有些位置为0,才能使用
题目中有b1,b2,f1,f2
软件包含b1错误,不包含b2错误,能够修复f1,加入错误f2
我们看看补丁3

0-- -++

使用状态:(判断一个补丁包能否使用)
b1是000=0(因为第一个字符串里面没有+)
b2是011=3(第一个字符串中 第二三位是-)
记当前状态为x
1.判断x中b1位上是否都为1(说明x是否含有b1错误)
我们可以将x与b1按位与。如果得到的值是b1本身,那就说明x的b1位上都是1
2.判断x中b2位上是否都为0(说明x是否含有b2错误)
也是将b2与x按位与,如果得到的都是0,说明x的b2位上都是0

if((x&p[i].b1)==p[i].b1 && (x&p[i].b2)==0)//说明该补丁包可以使用

修复状态:(使用后的情况)
使用后,f1位置会修好变成0,f2会变成1。
当前状态为x,如果要将f2位置变成1,直接x或上f2即可。f1位置变成0,我们可以或上一个f1,使得当前状态的所有f1位置都变成1,再异或一个f1,这样就可以将f1所有位置变成0.

int y=((x|p[i].f1)|p[i].f2)^p[i].f1;

应该算讲的很详细了吧!

代码:

//第一个字符串中+ 
//第二个字符串-
#include<bits/stdc++.h>
#define Maxn 100
#define Maxm 100
#define Maxnum  4000000using namespace std;inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n,m; 
int ST;struct debug{int b1;int b2;int f1;int f2;int T;
}hero[Maxm+2];priority_queue < pair<int,int> > q;
int dist[Maxnum]; 
int vis[Maxnum];
void dj(){memset(dist,0x3f,sizeof(dist));dist[ST]=0;q.push(make_pair(0,ST));while(!q.empty()){int now=q.top().second;q.pop();if(vis[now]==1) continue;vis[now]=1;for(int i=1;i<=m;i++){if( (hero[i].b1&now)==hero[i].b1 && (hero[i].b2&now)==0 ){int v=((now|hero[i].f1)^hero[i].f1)|hero[i].f2;if(dist[now]+hero[i].T<dist[v]){dist[v]=dist[now]+hero[i].T;q.push(make_pair(-dist[v],v));}}}}
}int main(){n=read(); m=read();for(int i=1;i<=n;i++)ST=ST|(1<<i);//ST表 cout<<ST<<endl;for(int i=1;i<=m;i++){hero[i].T=read();string B,F;cin>>B>>F;for(int j=0;j<=n-1;j++){if(B[j]=='+')hero[i].b1=hero[i].b1|(1<<(j+1));if(B[j]=='-')hero[i].b2=hero[i].b2|(1<<(j+1));if(F[j]=='+')hero[i].f2=hero[i].f2|(1<<(j+1));if(F[j]=='-')hero[i].f1=hero[i].f1|(1<<(j+1));}}dj();if(dist[0]==dist[Maxnum-1])cout<<"0";elsecout<<dist[0];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地&#xff0c;为Xamarin及.NET技术达人提供展示分享的舞台&#xff0c; 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台&#xff01;网址链接&#xff1a;http://bxug.bopoda.cn/Xamarin中国…

用python将图片转换成二值图像

大创项目是图像识别&#xff0c;第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle&#xff0c;这次要用到图像库PIL的类Image&#xff0c;也算是刚刚从零开始学起 整体效果&#xff08;用01串表示图像&#xff09; 原理很简单&#xff1a;将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了&#xff0c;但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档&#xff0c;如何搭建一个SignalR的Demo。参考文章&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板&#xff0c;kkk个红色木板&#xff0c;给出这些木板的高度&#xff0c;木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法&#xff0c;每个点uuu的父亲定义为第一次遍历uuu时的前驱结点&#xff0c;若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一&#xff0c;总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树&#xff0c;问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…

均分纸牌问题

均分纸牌有三种情况&#xff1a;线性&#xff0c;环形&#xff0c;二维 文章目录线性题目描述思路&#xff1a;代码&#xff1a;环形题目描述思路代码线性 题目描述 P1031 均分纸牌 有N堆纸牌&#xff0c;编号分别为1,2,…,N。每堆上有若干张&#xff0c;但纸牌总数必为N的倍…

.net core实践系列之短信服务-Api的SDK的实现与测试

前言上一篇《.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现》讲解了API的设计与实现&#xff0c;本篇主要讲解编写接口的SDK编写还有API的测试。或许有些人会认为&#xff0c;SDK的编写可以不需要&#xff0c;既然已经用了RESTful web服务与Swagger提供的接口描述&…

[集训队作业2018] count(笛卡尔树,生成函数,卡特兰数)

传送门 什么情况下两序列同构 对于两序列A[1,n],B[1,n]A[1,n],B[1,n]A[1,n],B[1,n]&#xff0c;设fA(1,n)pa,fB(1,n)pbf_A(1,n)p_a,f_B(1,n)p_bfA​(1,n)pa​,fB​(1,n)pb​&#xff0c; 若pa̸pbp_a\notp_bpa​​pb​&#xff0c;A,BA,BA,B一定不同构。若papbp_ap_bpa​p…

P4016 负载平衡问题

文章目录题目描述题解&#xff1a;方法一&#xff1a;代码&#xff1a;方法二&#xff1a;P4016 负载平衡问题题目描述 G 公司有 n 个沿铁路运输线环形排列的仓库&#xff0c;每个仓库存储的货物数量不等。如何用最少搬运量可以使 n 个仓库的库存数量相同。搬运货物时&#xff…

Ocelot简易教程(二)之快速开始2

为什么这篇的标题叫“Ocelot简易教程&#xff08;二&#xff09;之快速开始2”呢&#xff0c;因为很多朋友跟我说上一篇“ Ocelot简易教程&#xff08;二&#xff09;之快速开始1”内容太少了&#xff0c;只是简单介绍Ocelot的一些简单配置&#xff0c;让Ocelot能跑起来&#x…

.NET的前世今生与将来

笔者注谨以此文纪念我敬重的2016年9月17日去世的 装配脑袋 逝世两周年让大家久等了&#xff0c;前后花了1年的时间&#xff0c;几经改版&#xff0c;终于完成撰写了一万字长文&#xff0c;回顾和展望.NET这16年来的成功与失败。最终能成文是因为我给自己承诺必须赶在 装配脑袋 …

P4011 孤岛营救问题

P4011 孤岛营救问题 文章目录输入输出样例题意&#xff1a;题解&#xff1a;代码&#xff1a;输入输出样例 输入 4 4 9 9 1 2 1 3 2 1 2 2 2 0 2 1 2 2 0 2 1 3 1 0 2 3 3 3 0 2 4 3 4 1 3 2 3 3 0 3 3 4 3 0 4 3 4 4 0 2 2 1 2 4 2 1输出 14题意&#xff1a; (原题太长我就…

[NOI2014] 起床困难综合症(二进制,贪心)

#include<bits/stdc.h> int n,m,ans,x,a10,a2-1; //-1的补码:11111111111... char str[5]; int main(){scanf("%d%d",&n,&m);while(n--){scanf("%s%d",str,&x);if(str[0]A) a1&x, a2&x;if(str[0]X) a1^x, a2^x;if(str[0]O) a1|…

P4015 运输问题

P4015 运输问题 文章目录题目描述&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;题解&#xff1a;代码&#xff1a;题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 两行分别输出最小运输费用和最大运输费用。 输入输出样例…

NetCore使用Jwtbearer给WebAPI添加访问控制

现在JWT代替session来做访问控制已经成为大部分webapi的做法&#xff0c;今天我们也来尝试一下WebAPI使用NetCore2.1创建,无身份认证信息nuget安装包IdentityModel 选择稳定版3.9.0Microsoft.AspNetCore.Authorization 版本2.1.1Microsoft.AspNetCore.Authentication.JwtBearer…

图论复习——网络流

最大流 与 最小费用最大流 Blog 有上下界网络流 Blog 最小割 Blog 模拟费用流 CF724E Goods transportation 摘自此Blog 建图优化 若同一行或者同一列的点互相可达&#xff0c;那么其实不需要两两连边&#xff0c;只需要对于每行和每列建一个辅助节点作为中转 [ARC…

离散大创项目——图片识别笔记

1.我才知道ainput()读入的竟然是字符串。。。还要强制转化成int型&#xff0c;这玩意搞了我好久 2.对照片进行裁剪&#xff0c;将照片周围多余的白色部分去除&#xff08;也就是让图像尽可能撑满整个框&#xff09; 由上一张裁成下一张 from PIL import Image import os SCA…

最小割小记

参考博客&#xff1a;最小割浅谈 关于最小割 常用描述 表述一&#xff1a;删去若干条边使得源点到汇点不连通&#xff0c;求删边的权值和的最小可能值。 表述二&#xff1a;将点集分为(S,T)(S,T)(S,T)&#xff0c;记所有从SSS中出发到TTT中的边的权值和为c(S,T)c(S,T)c(S,T)&a…

斐波那契数列求法

文章目录求斐波那切数列的几个方法&#xff1a;经典做法&#xff1a;递推&#xff1a;动态规划矩阵快速幂原理&#xff1a;代码&#xff1a;例题&#xff1a;模拟过程求斐波那切数列的几个方法&#xff1a; 经典做法&#xff1a; 众所周知&#xff1a;斐波那契数列的定义是f(…