UVA565

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

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

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值