UVA565 Pizza Anyone? (状态压缩,搜索)
UVA565 Pizza Anyone?
大致题意:现在你要做一份披萨,有A到P共16种食材。现在给你1~12个人对这个披萨加入不同食材的条件(只包含想要和不想要两种)(加号是想要,减号是不想要,不一定包含所有食材),问你是否能选一些食材做披萨使得每一个人都存在一个条件是被满足了的(如果它不想要你也没放,这也算满足!)输出要求字典序最小!
$ solution: $
看到这道题应该想到的一些东西:
- 状态压缩,用1和0表示加入这种食材或不加
- 暴力搜索然后check,这一题范围太小了,只有16种食材,我们可以枚举放哪些(这样可以保证字典序)
- 然后每一个人对某些食材是否需要也可以状态压缩(这里的状压见后文)(之前写错了,不是爆搜)
但这道题还有一个神奇的优化,因为我们知道上述的第三点是不好做到的,因为有可能某一个人对一些食材并没有要求,这样我们如何来状压使的我们可以清晰的描述每一个人的要求呢?我们其实不难想到,我们可以对想要这种食材和不想要这种食材分开处理,用两个二进制数来表示!第一个二进制数某一位上为1表示想要,第二个二进制数某一位上为1表示不想要,这样我们就可以把我们爆搜得出来的数和第一个与运算(可以得到他们想要某些食材的要求是否得到满足),然后取反(1变0,0变1)再和第二个数与运算(可以得到他们不想要某些食材的要求是否得到满足),这样即使某一些人对某些食材没有要求也不会影响我们的答案了!
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
char s[33];
int n,f,tot=1<<16;
int a[2][15];
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
while(scanf("%s",s)!=EOF){
if(s[0]=='.'){ rg i,j;
for(i=0;i<tot;++i){
for(j=0;j<n;++j)
if(!(i&a[1][j])&&!(~i&a[0][j]))break;
if(j==n){
printf("Toppings: ");
for(rg k=0;k<16;++k)
if(i&(1<<k))putchar('A'+k);
puts(""); break;
}
}if(i==tot)puts("No pizza can satisfy these requests.");
n=0; for(i=0;i<15;++i)a[0][i]=a[1][i]=0; continue;
}
for(rg i=0;s[i]!=';';++i){
if(s[i]=='+')f=1;
if(s[i]=='-')f=0;
if(s[i]>='A'&&s[i]<='P')
a[f][n]|=1<<(s[i]-'A');
}++n;
}
return 0;
}
UVA565 Pizza Anyone? (状态压缩,搜索)的更多相关文章
- POJ 1632 Vase collection【状态压缩+搜索】
题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS Memory Limit: 10000K Total ...
- Codeforces3C. Tic-tac-toe 题解 状态压缩+搜索
作者:zifeiy 标签:状态压缩.搜索 题目链接:https://codeforces.com/contest/3/problem/C 题目大意: 有一个 \(3 \times 3\) 的棋盘,给你 ...
- JZYZOJ 1385 拉灯游戏 状态压缩 搜索
http://172.20.6.3/Problem_Show.asp?id=1385 刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打 ...
- 搜索进阶课件,视频,代码(状态压缩搜索,折半搜索,dfs,bfs总结)
链接:https://pan.baidu.com/s/1-svffrprCOO4CtQoCTQ9hQ 提取码:h909 复制这段内容后打开百度网盘手机App,操作更方便哦
- hdu4845 状态压缩BFS
题意: 给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路: ...
- loj 1011(状态压缩+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837 思路:状态压缩+记忆化搜索. #include<io ...
- 最大联通子数组之和(dfs,记忆化搜索,状态压缩)
最大联通子数组,这次的题目,我采用的方法为dfs搜索,按照已经取到的数v[][],来进行搜索过程的状态转移,每次对v[][]中标记为1的所有元素依次取其相邻的未被标记为1的元素,将其标记为1,然而,这 ...
- Doing Homework---hdu1074(状态压缩&&记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最 ...
- POJ 2046 Gap 搜索- 状态压缩
题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...
随机推荐
- Codeforces Round #545 (Div. 1)
本来开头两道题写得挺快的,然后第三题想了一会儿胡出一个scc计算gcd的做法,写了一发凭借信仰交了上去结果一发pp了?然后第四题沙雕了想了很久才会,于是罚时瞬间变多.结果后面两题都没时间看了,赛后感觉 ...
- python---random模块详解
在python中用于生成随机数的模块是random,在使用前需要import, 下面看下它的用法. random.random random.random()用于生成一个0到1的随机符点数: 0 &l ...
- BZOJ2006[NOI2010]超级钢琴——堆+主席树
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...
- Codeforces Round #428 (Div. 2)A,B,C
A. Arya and Bran time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- tensorflow_mmp
搭建win10+py3.6+cuda9.1+cudnn7+tf1.5(如果想知道为什么这么搭配,自己去装两天就知道了) tensorflow_gpu......whl下载 剩下的官网下载,cuda9. ...
- 【AGC005F】Many Easy Problems (NTT)
Description 给你一棵\(~n~\)个点的树和一个整数\(~k~\).设为\(~S~\)为树上某些点的集合,定义\(~f(S)~\)为最小的包含\(~S~\)的联通子图的大小.\(~n~ ...
- BZOJ4008 : [HNOI2015]亚瑟王(期望dp)
题意 略(看了20min才看懂...) 题解 我一开始天真地一轮轮推期望,发现根本不好算... 唉~ 不会做就只能抄题解咯 看了一波DOFY大佬的解法qwq 发现有句神奇的话 记住,期望要倒着推... ...
- JavaScript表格插件库
DataTables https://datatables.net/ Handsontable https://handsontable.com/ JsGrid http://js-grid.com/ ...
- Office2016自定义安装
Office2016已经不提供自定义安装功能,而采用C2R安装方式.使用镜像安装时,默认全部安装.想要自定义安装就需要用到微软提供的Office2016部署工具. 步骤 下载并运行微软提供的Offic ...
- 【SPOJ10628】Count on a tree
题目大意:给定一棵 N 个节点的树,点有点权,要求回答 M 个询问,每次询问点 u 到点 v 的简单路径(链)上权值第 K 小是多少. 题解:学习到了树上主席树. 主席树维护序列时,每次将后一个点的树 ...