题目的意思就是你要去买披萨,你的每个朋友都有自己的想吃的东西和不想吃的东西。。
然后你必须满足每个朋友至少一个要求。
问买回来的披萨里面有什么。没有符合的就输出no啥啥。
这题我用了枚举,把 2 的17 次方 - 1种情况枚举了一边 ,但是超时;
后来我把朋友朋友要求的数量排了个序,要求少的排前面。(因为要求少的最有可能无法满足,就能直接进入下一种情况)
跑了2399ms 很悬,看了别人的都是用回溯 + 剪枝 ,会比我快不少。
还有就是题目明明说朋友只有12个,我开12 RE了,开了100过。
AC代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int conti[100][16];
int judge[16];
int num;
bool fin;
int cmp (string a ,string b){
return a.size() < b.size();
}
void init() {
for (int i = 0 ; i < 100 ;i++ ) {
for (int j = 0 ; j < 16 ;j++) {
conti[i][j] = -1;
}
}
fin = false;
}
bool compare () {
bool ok = false;
for (int i = 0 ; i < num ;i++) {
for (int j = 0 ; j < 16 ; j++) {
if (conti[i][j] == judge[j])
break;
if (j == 15)
return false;
}
}
return true;
}
int main () {
string temp[100];
num = 0;
init();
while (cin >> temp[0]){
num = 0;
init();
while(temp[num][0] != '.') {
cin >> temp[++num];
}
sort(temp , temp + num ,cmp);
// for (int i = 0 ; i < num ;i++ ) {
// cout << temp[i] <<endl;
// }
for (int i = 0 ; i < num ;i++) {
for (int j = 0 ; j < temp[i].size() - 1 ;j++) {
if (temp[i][j] == '+')
conti[i][temp[i][j + 1] - 'A'] = 1;
if (temp[i][j] == '-')
conti[i][temp[i][j + 1] - 'A'] = 0;
}
}
for (int i = 0 ; i < (1 << 16) ;i++) {
for (int k = 0 ; k < 16 ;k++) {
if (i & (1 << k))
judge[k] = 1;
else
judge[k] = 0;
}
if(compare()) {
fin = true;
cout << "Toppings: ";
for (int j = 0 ; j < 16 ;j++) {
if (judge[j] == 1)
cout << char(j + 'A');
}
cout << endl;
break;
}
}
if (fin == false)
cout << "No pizza can satisfy these requests."<<endl;
num = 0;
}
return 0;
}