此题大意:某个人要买一个pizza和朋友一起吃,每个人都有一些要求,要求是需要满足每个人至少一个要求。
注意点:对于某个人来说,若存在他不想要的但是存在他想要的是可以的,也可以存在没有他想要的,但是他不想要也没得。
这道题我用了4个多小时:
第一次:使用了集合+二进制枚举子集 TLE。
第二次:使用map+二进制枚举子集TLE。
第三次:使用了数组+二进制枚举子集 2.282秒。
第四次:使用了IDA*来dfs , 用时 0.928秒
第五次:加上美剧时的上限,用时 0.692秒
此题缩短时间复杂度的方法
1.使用数组保存每个要求 不要的东西的个数,使用数组每个要求。
2.使用IDA*。
//
// main.cpp
// uva 565 - Pizza Anyone?
//
// Created by XD on 15/8/7.
// Copyright (c) 2015年 XD. All rights reserved.
//
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
using namespace std ;
int n ;
int maxd ;
int visp[20] ;
int vism[20] ;
int t1 ;
int t ;
int con[20] ;
int ans[20] ;
char s[110] ;
int pizza_con[20][2][20] ;
int pizzaminus[20][1] ;
void initConstraints()
{
int len = (int )strlen(s) ;
pizzaminus[n][0]= 0 ;
for (int i = 0 ; i < len-1 ; i++) {
if (s[i]== '+') {
pizza_con[n][0][s[++i]-'A'+1] =1;
visp[s[i]-'A'+1] = 1 ;
}
else {
pizza_con[n][1][s[++i]-'A'+1] =1;
vism[s[i]-'A'+1] = 1 ;
pizzaminus[n][0]++ ;
}
}
n++ ;
}
bool satisfy(int x)
{
for (int i = 0; i < t1; i++) {
if (pizza_con[x][0][con[i]]==1) {
return true ;
}
}
int num = 0 ;
for (int i = 0; i < t1; i++) {
if (pizza_con[x][1][con[i]]==1) {
num++;
}
}
if (pizzaminus[x][0] -num == 0) {
return false ;
}
return true;
}
bool issatisfyEverone()
{
for (int i = 0; i < n ; i++) {
if (!satisfy(i)) {
return false ;
}
}
return true ;
}
int dfs(int d,int start)
{
if (d == maxd) {
t1 = d ;
if (issatisfyEverone()) {
return 1 ;
}
else{
return 0 ;
}
}
for (int i = start; i <= t - (maxd - d); i++) {
con[d] = ans[i] ;
if ( dfs(d+1, i+1))
{
return 1 ;
}
}
return 0 ;
}
int main() {
while (scanf(" %s" ,s)==1) {
memset(visp, 0, sizeof(visp)) ;
memset(vism, 0,sizeof(vism)) ;
memset(pizza_con, 0, sizeof(pizza_con)) ;
n=0 ;
initConstraints() ;
while (scanf(" %s" , s)==1 ) {
if (s[0] == '.') {
break ;
}
else
{
initConstraints() ;
}
}
t =0 ;
for (int i = 1; i < 17; i++) {
if(visp[i] || vism[i] ){
ans[t++] = i ;
}
}
int flag = 0 ;
for (maxd = 0; maxd <=t ; maxd++) {
if (dfs(0, 0)) {
printf("Toppings: ") ;
for (int j = 0 ; j < t1; j++) {
printf("%c" , con[j]+'A'-1) ;
}
printf("\n") ;
flag = 1 ;
break ;
}
}
// int end = (1<<t) ;
// for (int i = 0; i < end; i++) {
// t1 = 0 ;
// for (int j = 0 ; j <t ; j++) {
// if (i&(1 << j )) {
// con[t1++] = ans[j] ;
// }
// }
// if(issatisfyEverone())
// {
// printf("Toppings: ") ;
// for (int j = 0 ; j < t1; j++) {
// printf("%c" , con[j]+'A'-1) ;
// }
// printf("\n") ;
// flag = 1 ;
// break ;
// }
// }
if (!flag) {
printf("No pizza can satisfy these requests.\n") ;
}
}
return 0;
}