这题直接隐式图 + 位运算暴力搜出来的,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. Foundation 框架 NSFileManager,NSData 简单的文件操作

    一.简单展示NSFileManager的使用 #import <Foundation/Foundation.h> int main(int argc, const char * argv[ ...

  2. 开始学习Lucene

    最近百度的魏则西事件闹的沸沸扬扬,突然有个想法:是否百度的中文搜索目前还没有人能挑战它的地位呢? 哈哈,想的太多了,正巧毕业设计就和搜索有关,当时只是大致了解了概念:如分词.排序.索引.爬虫等,并以此 ...

  3. 反射以及 getDeclaredMethods()和getMethods()区别

    内容转载自http://blog.csdn.net/ljphhj/article/details/12858767 package cn.lee.demo; import java.lang.refl ...

  4. HDOJ----------1009

    题目: FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. rhApp遇到的项目问题

    1.如果有多人同时操作一个桌台的情况下,如何处理: 2.index页面点击清空的时候是否要把桌台一起清掉: 3.账单界面已结账的小单背景色是否需要和未结账的不同:

  6. 转: markdown基本语法

    Markdown 是一种轻量级标记语言,能将文本换成有效的XHTML(或者HTML)文档,它的目标是实现易读易写,成为一种适用于网络的书写语言. Markdown 语法简洁明了,易于掌握,所以用它来写 ...

  7. 让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

    Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要 ...

  8. [C++ Basic] Const 用法

    定义: const 主要用于声明常量.当常量为对象时,对象值不可改变:当常量为指针时,该指针不可移动或重新赋值,但我们可以通过它去修改该指针的指向对象的值(前提是无需移动指针的修改).所谓的形参.返回 ...

  9. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  10. Android开发之旅:android架构

    本篇将站在顶级的高度——架构,来看android.我开篇就说了,这个系列适合0基础的人且我也是从0开始按照这个步骤来 学的,谈架构是不是有点螳臂挡车,自不量力呢?我觉得其实不然,如果一开始就对整个an ...