UVA565

来源:互联网 发布:淘宝买电动车可靠吗 编辑:程序博客网 时间:2024/06/11 04:35

题目的意思就是你要去买披萨,你的每个朋友都有自己的想吃的东西和不想吃的东西。。

然后你必须满足每个朋友至少一个要求。

问买回来的披萨里面有什么。没有符合的就输出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;elsejudge[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;}


0 0