CTSC1999补丁VS错误题解
题目描写叙述 Description
错误就是人们所说的Bug。用户在使用软件时总是希望其错误越少越好。最好是没有错误的。可是推出一个没有错误的软件差点儿不可能,所以非常多软件公司都在疯狂地发放补丁(有时这样的补丁甚至是收费的)。T公司就是当中之中的一个。
上个月。T公司推出了一个新的字处理软件,随后发放了一批补丁。近期T公司发现其发放的补丁有致命的问题。那就是一个补丁在排除某些错误的同一时候,往往会增加还有一些错误.
此字处理软件中仅仅可能出现n个特定的错误,这n个错误是由软件本身决定的。T公司眼下共发放了m个补丁。对于每个补丁, 都有特定的适用环境,某个补丁仅仅有在当前软件中包括某些错误而同一时候又不包括还有一些错误时才干够使用。假设它被使用。它将修复某些错误而同一时候增加某些错误。另外,使用每个补丁都要耗一定的时间(即补丁程序的执行时间)。
更准确地说明:
设此字处理软件中可能出现的n个错误为集合B={b1,b2,…,bn}中的元素。T公司眼下共发放了m个补丁:p1,p2,…,pm。对于每个补丁pi, 都有特定的适用环境,某个补丁仅仅有在软件中包括某些错误而同一时候又不包括还有一些错误时才干够用,为了说明清楚,设错误集合:Bi+、 Bi-。 当软件包括了Bi+中的全部错误, 而没有包括Bi-中的不论什么错误时,补丁Pi才干够被使用。否则不能使用。显然 Bi+、Bi-交集为空。补丁pi将修复某些错误而同一时候增加某些错误。设错误集合Fi-、Fi+,使用过补丁pi之后。Fi-中的不论什么错误都不会在软件中出现。而软件将包括Fi+中的全部错误。 相同Fi-、Fi+交集为空。另外,使用每个补丁都要耗一定的时间(即补丁程序的执行时间)。
如今T公司的问题非常easy,其字处理软件的初始版本号不幸地包括了集合B中的全部n个错误, 有没有可能通过使用这些补丁(随意顺序地使用。一个补丁可使用多次), 使此字处理软件成为一个没有错误的软件。假设可能,希望找到总耗时最少的方案。输入描写叙述 Input Description
输入文件第一行有两个正整数n和m, n表示错误总数。m表示补丁总数。接下来m行给出了m个补丁的信息。每行包括一个正整数(表示此补丁程序pi的执行耗时)和两个长度为n的字符串,中间用一个空格符隔开。第一个字符串。假设第k个字符为’+’,则表示bk属于Bi+, 若为‘-’,则表示bk属于Bi-, 若为‘0’。则bk 既不属于Bi+也不属于Bi-。即软件中是否包括bk不影响补丁pi是否可用。
第二个字符串。假设第k个字符为’+’,则表示bk属于Fi+, 若为‘-’,则表示bk属于Fi-, 若为‘0’。则bk 既不属于Fi+也不属于Fi-,即软件中是否包括bk不会因使用补丁pi而改变。输出描写叙述 Output Description
输出一个整数,假设问题有解,输出总耗时,否则输出0。例子输入 Sample Input
3 3
1 000 00-
1 00- 0-+
2 0– -++例子输出 Sample Output
8数据范围及提示 Data Size & Hint
1≤n≤20,1≤m≤100
只是据说n最大仅仅有15。按15做的能够过。
题解
用二进制存错误的全部错误状态,共2n种。以下的程序中。用reqt[i](require true)表示第i个补丁须要有哪些错误(二进制表示。下同),reqf[i](require false)表示第i个补丁须要没有哪些错误,用rest[i](result in true)表示装了第i个补丁后出现了哪些新的错误,用resf[i](result in false)表示装了第i个补丁后消除了哪些错误,timi表示第i个补丁执行的时间。空间复杂度约为O(2n),全然能够承受。
初始状态为2n−1(二进制)。末状态为0。
枚举全部状态和补丁。假设某状态能够装某补丁,即从该状态添一条指向装补丁之后的状态的有向边(别添反了),边权为该补丁执行的时间。这之后再从初始状态開始跑堆优化dijkstra最短路就可以。时间复杂度O((m+n)2n),n=20可能就过不了了。只是既然搜索都能够过,那这个算法就没有只是的理由了。
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = (1 << 17), oo = 1000000000, nil = 0;
int N, M, tim[105], reqt[105], reqf[105], rest[105], resf[105];
int e, pnt[maxn], nxt[maxn << 2], u[maxn << 2], v[maxn << 2], w[maxn << 2];
int d[maxn];
bool vis[maxn];
struct node
{
int n, dis;
node(int n = 0, int dis = 0) :n(n), dis(dis) {}
bool operator < (const node& b) const
{
return dis > b.dis;
}
};
void addedge(int a, int b, int c)
{
u[++e] = a; v[e] = b; w[e] = c;
nxt[e] = pnt[a]; pnt[a] = e;
}
void init()
{
char ch[25];
scanf("%d%d", &N, &M);
for(int i = 1; i <= M; ++i)
{
scanf("%d", &tim[i]);
scanf("%s", &ch);
for(int j = 0; j < N; ++j)
{
if(ch[j] == '+')
{
reqt[i] |= (1 << j);
}
if(ch[j] == '-')
{
reqf[i] |= (1 << j);
}
}
scanf("%s", &ch);
for(int j = 0; j < N; ++j)
{
if(ch[j] == '+')
{
rest[i] |= (1 << j);
}
if(ch[j] == '-')
{
resf[i] |= (1 << j);
}
}
}
for(int i = (1 << N) - 1; i >= 0; --i)
{
for(int j = 1; j <= M; ++j)
{
if(((i & reqt[j]) == reqt[j]) && ((i & reqf[j]) == 0))
{
addedge(i, (i & (~resf[j]) | rest[j]), tim[j]);
}
}
}
}
void work()
{
int S = (1 << N) - 1, T = 0;
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
priority_queue <node> Q;
d[S] = 0;
Q.push(node(S, 0));
while(!Q.empty())
{
node tmp = Q.top();
Q.pop();
vis[tmp.n] = true;
for(int j = pnt[tmp.n]; j != nil; j = nxt[j])
{
if((!vis[v[j]]) && d[v[j]] > tmp.dis + w[j])
{
d[v[j]] = tmp.dis + w[j];
Q.push(node(v[j], d[v[j]]));
}
}
}
if(d[T] > oo)
{
puts("0");
}
else
{
printf("%d\n", d[T]);
}
}
int main()
{
init();
work();
return 0;
}
CTSC1999补丁VS错误题解的更多相关文章
- 2218 补丁vs错误
2218 补丁vs错误 1999年CTSC国家队选拔赛 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题解 题目描述 Description 错 ...
- [CTSC1999][网络流24题]补丁VS错误
题目:洛谷P2761.vijos P1019.codevs1239.codevs2218. 题目大意:有n个错误,m个不同的补丁. 对于一个补丁,有两个不同的字符串描述.具体如下: 如果当前错误包含第 ...
- Vijos1019 补丁VS错误[最短路 状态压缩]
描述 错误就是人们所说的Bug.用户在使用软件时总是希望其错误越少越好,最好是没有错误的.但是推出一个没有错误的软件几乎不可能,所以很多软件公司都在疯狂地发放补丁(有时这种补丁甚至是收费的).T公 ...
- 补丁vs错误(codevs 2218 错误答案)
题目描述 Description 错误就是人们所说的Bug.用户在使用软件时总是希望其错误越少越好,最好是没有错误的.但是推出一个没有错误的软件几乎不可能,所以很多软件公司都在疯狂地发放补丁(有时这种 ...
- SCU-4527 NightMare2(Dijkstra+BFS) !!!错误题解!!!
错解警告!!! 描述 可怜的RunningPhoton又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着 ...
- leetcode 错误题解,反面教材 Gas Station
class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& c ...
- OWASP-A5-安全配置错误
1.安全配置错误 安全配置错误可以发生在一个应用程序堆栈的任何层面,包括平台.Web服务器.应用服务器.数据库.框架和自定义代码. 开发人员和系统管理员需共同努力,以确保整个堆栈的正确配置.自动扫描器 ...
- [洛谷P1527] [国家集训队]矩阵乘法
洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...
- linux内核调试指南
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
随机推荐
- JS~重写alter与confirm,让它们变成fancybox风格
插件与系统命令 对于很多JS弹框插件来说,都提供了alter,confirm等功能,如fancybox,Boxy等插件,今天来介绍一下如何将系统的alter和confirm替换成指定插件的alter和 ...
- PHP设计模式笔记一:准备工作 -- Rango韩老师 http://www.imooc.com/learn/236
一.编程字体选择 1.选择等宽字体 包括Courier New ,Consolas,Source Code Pro(推荐) 2.环境搭建(建议easyPHP) 二.开发符合PSR规范的基础框架 PSR ...
- yii使用寻呼功能
CDbCriteria这是类包使用,包是yii自带专门用来处理类似分类这种功能的. 而我们使用yii框架然后调用这种方法会起到事半功倍的效果,会发现使用这个可以节省非常多的时间.让你高速的使用PHP中 ...
- ThinkPHP整合百度Ueditor图文教程
ThinkPHP整合百度Ueditor图文教程 ThinkPHP整合百度Ueditor,基于黄永成老师的视频说明的申明:最好大家都能写绝对路径的都写好绝对路径比如:window.UEDITOR_HOM ...
- CDN云主机与传统虚拟主机功能对比
CDN云主机与传统虚拟主机功能对比 传统的虚拟主机都是单台服务器,一旦机器硬件损坏.IP被封.机房网络故障等,都将导致网站不能访问,严重的情况数据还无法及时取回,即使想换一家服务商也因为没有数据而无能 ...
- Git服务器 gitweb与gitLab的区别
昨天我们已经把Git服务器搭建完成了,工程的上传与下载都可以了,不过有些人不喜欢使用git命令进行操作.所以我们就搭建一个可视化操作的环境!配置gitweb和gitlab两种访问方式! 一,配置git ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- [ofbiz]设置任务计划(job),提示service_item已经传递
问题描述:设置任务计划(job),提示service_item已经传递 解决办法: 红色框内不要填写,就可以了."已经传递"是翻译的不准确,应该是"已过时",所 ...
- project euler 12 Highly divisible triangular number
Highly divisible triangular number Problem 12 The sequence of triangle numbers is generated by addin ...
- HDU ACM 题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...