这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式。

1.将s中二进制第k位变成0的处理方式:

s = s & (~(1 << pos));

将s中二进制第k位变成1的处理方式:

s = s | (1 << pos);

2.二进制运算:

[1] & : 1 & 1 = 1 , 1 & 0 = 0 , 0 & 0 = 0;

高速推断奇偶性:

    if(a & 1);//为奇数
if(!(a & 1));//为偶数

[2] |  : 1 | 1 = 1 , 0 | 1 = 1 , 0 | 0 = 0;

[3] ~ : (按位取反) 比方 10011 取反后为 01100;

[4] ^  :  
假设參加运算的两个二进制同号,结果为0,异号结果为1,比方 1 ^ 1 = 0 , 0 ^ 0 = 0 ,1 ^ 0 = 1 , 0 ^ 1 = 1;

使用方法的话:比方101010100 将后4位翻转,那么能够让它 ^ 000001111 (相当于对指定的一段二进制位取反了)

交换2个值不运用暂时变量:

    a = a ^ b;
b = b ^ a;
a = a ^ b;

资料:http://www.cnblogs.com/qkhhxkj/archive/2011/06/29/2093894.html

14062589 658 It's not a Bug, it's a Feature! Accepted C++ 2.525 2014-08-19 03:16:25

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<list>
#include<cmath>
#include<string>
#include<sstream>
#include<ctime>
using namespace std;
#define _PI acos(-1.0)
#define INF (1 << 10)
#define esp 1e-9
#define MOD 100000007
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> pill;
/*===========================================
===========================================*/
#define MAXD 100 + 10
int n,m;
struct Bug{
vector<int>s[2];
vector<int>c[2];
int cost ;
}bug[MAXD];
int Judge(int s,int cur){
for(int i = 0 ; i < bug[cur].s[0].size(); i++){
int pos = bug[cur].s[0][i]; /*必须有bug的位置*/
if(!((s >> pos) & 1))
return -1;
}
for(int i = 0 ; i < bug[cur].s[1].size(); i++){
int pos = bug[cur].s[1][i]; /*必须没bug的位置*/
if((s >> pos) & 1)
return -1;
}
for(int i = 0 ; i < bug[cur].c[0].size(); i++){
int pos = bug[cur].c[0][i]; /*改完之后存在BUG的地方*/
s = s | (1 << pos);
}
for(int i = 0 ; i < bug[cur].c[1].size(); i++){
int pos = bug[cur].c[1][i]; /*改完之后不存在BUG的地方*/
s = s & (~(1 << pos));
}
return s;
}
int solve(){
int s = (1 << n) - 1;
map<int,int>vis;
priority_queue<pill,vector<pill>,greater<pill> >q;
q.push(make_pair(0,s));
while(!q.empty()){
pill temp = q.top(); q.pop();
int dist = temp.first;
int node = temp.second;
vis[node] = 1;
if(node == 0) /*全部bug都弥补了*/
return dist;
for(int i = 0 ; i < m ; i++){
int ans = Judge(node,i);
if(ans >= 0 && !vis[ans]){
q.push(make_pair(dist + bug[i].cost,ans));
}
}
}
return -1;
}
int main(){
int Case = 1;
while(scanf("%d%d",&n,&m)){
if(!n && !m)
break;
for(int i = 0 ; i < m ; i++){
char str[MAXD];
scanf("%d%s",&bug[i].cost,str);
bug[i].s[0].clear(); bug[i].s[1].clear();
bug[i].c[0].clear(); bug[i].c[1].clear();
int L = strlen(str);
for(int j = 0 ; j < L; j++)
if(str[j] == '+')
bug[i].s[0].push_back(L - j - 1); /*必须有补丁的位置*/
else if(str[j] == '-')
bug[i].s[1].push_back(L - j - 1); /*必须没补丁的位置*/
scanf("%s",str);
L = strlen(str);
for(int j = 0 ; j < L; j++)
if(str[j] == '+')
bug[i].c[0].push_back(L - j - 1); /*打完后有补丁的位置*/
else if(str[j] == '-')
bug[i].c[1].push_back(L - j - 1); /*打完没补丁的位置*/
}
int ans = solve();
printf("Product %d\n",Case ++);
if(ans < 0)
printf("Bugs cannot be fixed.\n");
else
printf("Fastest sequence takes %d seconds.\n",ans);
printf("\n");
}
return 0;
}

【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)的更多相关文章

  1. It&#39;s not a Bug, It&#39;s a Feature! (poj 1482 最短路SPFA+隐式图+位运算)

    Language: Default It's not a Bug, It's a Feature! Time Limit: 5000MS   Memory Limit: 30000K Total Su ...

  2. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  3. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  4. UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)

    隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...

  5. uva_658_It&#39;s not a Bug, it&#39;s a Feature!(最短路)

    It's not a Bug, it's a Feature! Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & ...

  6. UVa 658 (Dijkstra) It's not a Bug, it's a Feature!

    题意: 有n个BUG和m个补丁,每个补丁用一个串表示打补丁前的状态要满足的要求,第二个串表示打完后对补丁的影响,还有打补丁所需要的时间. 求修复所有BUG的最短时间. 分析: 可以用n个二进制位表示这 ...

  7. 倒水问题UVA 10603——隐式图&&Dijkstra

    题目 给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空.最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的 ...

  8. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

  9. UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. C++运算符重载为非成员函数

    #include<iostream> using namespace std; class Complex{ public: Complex(double r=0.0,double i=0 ...

  2. objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )

    1.随机数的使用      1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc ...

  3. Spring 中拦截器与过滤器的区别

    spring 中拦截器 与servlet 的filter 有相似之处.比如二者都是aop 编程思想的体现都能实现权限检查,日志记录等. 不同之处 使用范围不同 Filter 是Servlet 规定的. ...

  4. UVa 1658 Admiral(最小费用最大流)

    拆点费用流 --------------------------------------------------------------------- #include<cstdio> # ...

  5. 手机测试Android程序

    手机测试Android程序   上传者:sanpi329     我也要“分享赚钱” 2014/7/9 关注(23) 评论(0)   声明:此内容仅代表网友个人经验或观点,不代表本网站立场和观点.   ...

  6. PHP中类的继承关系

    在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就能得到相应的功能.假设大致有这么一个父类: 1 <?php 2 class Father{ 3 4 public functi ...

  7. linux下c/c++方式访问curl的帮助手册

    自:http://blog.chinaunix.net/u1/47395/showart_1768832.html 有个业务需求需要通过curl 代理的方式来访问外网 百度了一把,测试可以正常使用.记 ...

  8. http://blog.csdn.net/baimafujinji/article/details/10931621

    书接上文,本文章是该系列的第二篇,按照总纲中给出的框架,本节介绍三个中值定理,包括它们的证明及几何意义.这三个中值定理是高等数学中非常基础的部分,如果读者对于高数的内容已经非常了解,大可跳过此部分.当 ...

  9. RADOS工作原理

    转:http://www.csdn.net/article/2014-04-08/2819192-ceph-swift-on-openstack-m/2 Ceph的工作原理及流程 本节将对Ceph的工 ...

  10. (译)Node.js的模块-exports和module.exports

    原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...