uva 565 Pizza Anyone?(二进制+搜索)

223 篇文章 1 订阅
179 篇文章 0 订阅


  Pizza Anyone? 

You are responsible for ordering a large pizza for you and your friends. Each of them has told you what he wants on a pizza and what he does not; of course they all understand that since there is only going to be one pizza, no one is likely to have all their requirements satisfied. Can you order a pizza that will satisfy at least one request from all your friends?


The pizza parlor you are calling offers the following pizza toppings; you can include or omit any of them in a pizza:

Input CodeTopping
AAnchovies
BBlack Olives
CCanadian Bacon
DDiced Garlic
EExtra Cheese
FFresh Broccoli
GGreen Peppers
HHam
IItalian Sausage
JJalapeno Peppers
KKielbasa
LLean Ground Beef
MMushrooms
NNonfat Feta Cheese
OOnions
PPepperoni

Your friends provide you with a line of text that describes their pizza preferences. For example, the line

+O-H+P;

reveals that someone will accept a pizza with onion, or without ham, or with pepperoni, and the line

-E-I-D+A+J;

indicates that someone else will accept a pizza that omits extra cheese, or Italian sausage, or diced garlic, or that includes anchovies or jalapenos.

Input 

The input consists of a series of pizza constraints.

A pizza constraint is a list of 1 to 12 topping constraint lists each on a line by itself followed by a period on a line by itself.

A topping constraint list is a series of topping requests terminated by a single semicolon.

An topping request is a sign character (+/-) and then an uppercase letter from A to P.

Output 

For each pizza constraint, provide a description of a pizza that satisfies it. A description is the string `` Toppings:  " in columns 1 through 10 and then a series of letters, in alphabetical order, listing the toppings on the pizza. So, a pizza with onion, anchovies, fresh broccoli and Canadian bacon would be described by:

Toppings: ACFO

If no combination toppings can be found which satisfies at least one request of every person, your program should print the string

No pizza can satisfy these requests.

on a line by itself starting in column 1.

Sample Input 

+A+B+C+D-E-F-G-H;
-A-B+C+D-E-F+G+H;
-A+B-C+D-E+F-G+H;
.
+A+B+C+D;
+E+F+F+H;
+A+B-G;
+O+J-F;
+H+I+C;
+P;
+O+M+L;
+M-L+P;
.
+A+B+C+D;
+E+F+F+H;
+A+B-G;
+P-O;
+O+J-F;
+H+I+C;
+P;
+O;
+O+M+L;
-O-P;
+M-L+P;
.

Sample Output 

Toppings:
Toppings: CELP
No pizza can satisfy these requests.

题目大意:就是给出一些字符串, + 代表需要, - 代表不需要,要你求一个最小的序列使得这个序列满足上述所有需求(一个需求只要满足其实中任意一个就行)。

解题思路:如果用普通的表示方法去做这道题的话,时间上绝对超时。可是仔细想一下,没样物品无非就是拿与不拿的关系,所以我们引入位位运算来简化判断的时间。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 1000

int n, ok, con[2][N], bo[N];
int Max = (1 << 16) - 1;

int handle(char str[]){
    int len = strlen(str);
    for (int i = 0; i < len - 1; i++){
	if (str[i] == '+')
	    con[1][n] += 1 << (str[++i] - 'A');
	else
	    con[0][n] += 1 << (str[++i] - 'A');
    }
}

bool judge(int k){
    for (int i = 0; i < n; i++){
	if (((k^Max) & con[0][i]) || (k & con[1][i]))
	    continue;
	else
	    return false;
    }
    return true;
}

int main(){
    char str[N];
    memset(con, 0, sizeof(con));
    n = ok = 0;
    while (gets(str)){
	if (strcmp(str, ".") != 0){
	    handle(str);
	    n++;
	    continue;
	}

	for (int i = 0; i <= Max; i++){
	    if (judge(i)){
		ok = 1;
		n = i;
		break;
	    }
	}

	if (ok){
	    printf("Toppings: ");
	    for (int i = 0; i <= 15; i++){
		if (n & (1 << i))
		    printf("%c", 'A' + i); 
	    }
	    printf("\n");
	}
	else
	    printf("No pizza can satisfy these requests.\n");

	// Init;
	memset(con, 0, sizeof(con));
	n = ok = 0;
    }
    return 0;}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值