UVA565 Pizza Anyone?

大致题意:现在你要做一份披萨,有A到P共16种食材。现在给你1~12个人对这个披萨加入不同食材的条件(只包含想要和不想要两种)(加号是想要,减号是不想要,不一定包含所有食材),问你是否能选一些食材做披萨使得每一个人都存在一个条件是被满足了的(如果它不想要你也没放,这也算满足!)输出要求字典序最小!



$ solution: $

看到这道题应该想到的一些东西:

  1. 状态压缩,用1和0表示加入这种食材或不加
  2. 暴力搜索然后check,这一题范围太小了,只有16种食材,我们可以枚举放哪些(这样可以保证字典序)
  3. 然后每一个人对某些食材是否需要也可以状态压缩(这里的状压见后文)(之前写错了,不是爆搜)

但这道题还有一个神奇的优化,因为我们知道上述的第三点是不好做到的,因为有可能某一个人对一些食材并没有要求,这样我们如何来状压使的我们可以清晰的描述每一个人的要求呢?我们其实不难想到,我们可以对想要这种食材和不想要这种食材分开处理,用两个二进制数来表示!第一个二进制数某一位上为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? (状态压缩,搜索)的更多相关文章

  1. POJ 1632 Vase collection【状态压缩+搜索】

    题目传送门:http://poj.org/problem?id=1632 Vase collection Time Limit: 1000MS   Memory Limit: 10000K Total ...

  2. Codeforces3C. Tic-tac-toe 题解 状态压缩+搜索

    作者:zifeiy 标签:状态压缩.搜索 题目链接:https://codeforces.com/contest/3/problem/C 题目大意: 有一个 \(3 \times 3\) 的棋盘,给你 ...

  3. JZYZOJ 1385 拉灯游戏 状态压缩 搜索

    http://172.20.6.3/Problem_Show.asp?id=1385   刚开始想的时候一直以为同一排不同的拉灯顺序对结果是有影响的,手推了好多遍才发现拉灯结果只和拉的灯有关,这也要打 ...

  4. 搜索进阶课件,视频,代码(状态压缩搜索,折半搜索,dfs,bfs总结)

    链接:https://pan.baidu.com/s/1-svffrprCOO4CtQoCTQ9hQ 提取码:h909 复制这段内容后打开百度网盘手机App,操作更方便哦

  5. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  6. loj 1011(状态压缩+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837 思路:状态压缩+记忆化搜索. #include<io ...

  7. 最大联通子数组之和(dfs,记忆化搜索,状态压缩)

    最大联通子数组,这次的题目,我采用的方法为dfs搜索,按照已经取到的数v[][],来进行搜索过程的状态转移,每次对v[][]中标记为1的所有元素依次取其相邻的未被标记为1的元素,将其标记为1,然而,这 ...

  8. Doing Homework---hdu1074(状态压缩&&记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最 ...

  9. POJ 2046 Gap 搜索- 状态压缩

    题目地址: http://poj.org/problem?id=2046 一道搜索状态压缩的题目,关键是怎样hash. AC代码: #include <iostream> #include ...

随机推荐

  1. indicator function指示函数

    指示函数   在集合论中,指示函数是定义在某集合X上的函数,表示其中有哪些元素属于某一子集A. 中文名 指示函数 外文名 indicator function 相关学科 数学.组合数学 其他称呼 特征 ...

  2. codeforces279B

    Books CodeForces - 279B When Valera has got some free time, he goes to the library to read some book ...

  3. Linux系统——程序员跳槽必备

    相信在看这篇文章的你,曾经或者现在是否跳槽呢,在北上广一线城市,你是否还在挣着那可怜巴巴的工资,过着拮据生活呢?但是自己想跳槽,却没有一技之长或者是自己的技术找工作太难了,那么我建议你学习下linux ...

  4. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  5. BZOJ3237 AHOI2013连通图(线段树分治+并查集)

    把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...

  6. TP5报错总结

    LNMP一键安装包上部署TP5项目500错误或者空白解决 [问题原因] TP5的入口文件在public下,当他调用类文件时,跨目录所以造成500错误,或者一片空白的问题 [解决方法] 1.public ...

  7. python成长之路五-文件操作

    1,文件操作 f = open("D:\种子.txt",encoding="utf-8",mode="r") # 打开一个种子.txt文件, ...

  8. LOJ2540 [PKUWC2018] 随机算法 【状压DP】

    题目分析: 听说这题考场上能被$ O(4^n) $的暴力水过,难不成出题人是毕姥爷? 首先思考一个显而易见的$ O(n^2*2^n) $的暴力DP.一般的DP都是考虑最近的加入了哪个点,然后删除后递归 ...

  9. 【刷题】BZOJ 1098 [POI2007]办公楼biu

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的 电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD ...

  10. android 同时打开两个sqlite database db

    1,数据库类 package com.example.testdb; import android.content.Context; import android.database.SQLExcept ...