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 Code | Topping |
A | Anchovies |
B | Black Olives |
C | Canadian Bacon |
D | Diced Garlic |
E | Extra Cheese |
F | Fresh Broccoli |
G | Green Peppers |
H | Ham |
I | Italian Sausage |
J | Jalapeno Peppers |
K | Kielbasa |
L | Lean Ground Beef |
M | Mushrooms |
N | Nonfat Feta Cheese |
O | Onions |
P | Pepperoni |
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.
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.
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.
+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; .
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;}