【UVA】658 - It's not a Bug, it's a Feature!(隐式图 + 位运算)
这题直接隐式图 + 位运算暴力搜出来的,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's not a Bug, it's a Feature!(隐式图 + 位运算)的更多相关文章
- It's not a Bug, It'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 ...
- UVA 658 状态压缩+隐式图+优先队列dijstla
不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...
- 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
隐式的图搜索,存不下边,所以只有枚举转移就行了,因为bug的存在状态可以用二进制表示,转移的时候判断合法可以用位运算优化, 二进制pre[i][0]表示可以出现的bug,那么u&pre[i][ ...
- uva_658_It's not a Bug, it's a Feature!(最短路)
It's not a Bug, it's a Feature! Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- UVa 658 (Dijkstra) It's not a Bug, it's a Feature!
题意: 有n个BUG和m个补丁,每个补丁用一个串表示打补丁前的状态要满足的要求,第二个串表示打完后对补丁的影响,还有打补丁所需要的时间. 求修复所有BUG的最短时间. 分析: 可以用n个二进制位表示这 ...
- 倒水问题UVA 10603——隐式图&&Dijkstra
题目 给你三个容量分别为 $a,b,c$ 的杯子,最初只有第3个杯子装满了水,其他两个杯子为空.最少需要到多少水才能让一个某个杯子中的水有 $d$ 升呢?如果无法做到恰好 $d$ 升,就让某个杯子里的 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 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& ...
随机推荐
- iOS开发笔记 基于wsdl2objc调用asp.net WebService
1.准备 先下载待会要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.zip 我用的是WSDL2ObjC-0.6.zip 1.1搭建asp.net WebServ ...
- zen-coding for notepad++,前端最佳手写代码编辑器
zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器. zen-Coding插件支持多种编辑器 ...
- zoj 2256 Mincost
#include<stdio.h> int main(void) { int kil; ; double sum; ) { sum=; flag=; while(kil) { ) { su ...
- 求新的集合 A=AUB(顺序表)
#include<stdio.h> typedef int A; const int LIST_INIT_SIZE=100; const int LISTINCREMENT=10; typ ...
- BZOJ 2982: combination( lucas )
lucas裸题. C(m,n) = C(m/p,n/p)*C(m%p,n%p). ----------------------------------------------------------- ...
- 我用过的Linux命令--修改主机名
下面的所有设置都是在CentOS中实验的,其他的Linux系统的玩法是一样的,只是配置文件的目录可能不一样. 局域网中的主机名类似于广域网中的域名,修改主机名有两种方式: (1)在当前会话中修改主机名 ...
- jquery回调函数callback的使用
回调函数必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数 callback函数在当前动画100%完成之后执行 $("p").hide(1000); alert(&quo ...
- ThinkPHP第十八天(Widget类的使用,连贯操作where IN用法,缓存S函数使用)
1.Widget类的使用方法: 第一步:在Action同级目录中新建Widget文件夹(独立分组需要自己建立) 第二步:根据不同功能在Widget文件夹中建立不同的Widget类,如热门文章HotWi ...
- CSS Select 标签取选中文本值
$("#userDep").find("option:selected").text()
- JDK JRE先保存 后面再整理
1. 定义 JRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只能运行Java程 序.JRE ...