uva uva 565 - Pizza Anyone?
来源:互联网 发布:小辣椒淘宝店 编辑:程序博客网 时间:2024/06/05 05:29
此题大意:某个人要买一个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;}
0 0
- UVa 565 - Pizza Anyone?
- uva 565 - Pizza Anyone?
- uva 565 - Pizza Anyone?
- uva 565 Pizza Anyone?
- UVA 565 Pizza Anyone?
- uva 565 Pizza Anyone?
- UVA 565 - Pizza Anyone?
- UVA - 565 Pizza Anyone?
- UVa 565 - Pizza Anyone?
- uva uva 565 - Pizza Anyone?
- uva 565 Pizza Anyone?(二进制+搜索)
- UVA 565 565 Pizza Anyone? (深搜 +位运算)
- uva 565 - Pizza Anyone?(暴力枚举 + 二进制)
- UVA - 565 Pizza Anyone?(状态压缩+暴利枚举)
- Uva-11732-strcmp() Anyone?
- Uva 11732 strcmp() Anyone?
- uva 11732 - strcmp() Anyone?
- UVa:11732 strcmp() Anyone?
- 开源远程登录、远程查看工具你知道几个
- 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间
- 守护进程与线程互斥
- 2015年浙江省职工职业技能大赛暨全国大赛选拔赛计算机程序设计员
- 计算Java List中的重复项出现次数【转】
- uva uva 565 - Pizza Anyone?
- 用For循环实现Python下的花样对称输出
- C++模板函数的小问题解决
- 装饰器模式,代理模式
- svn常用命令
- 2015 ACM多校训练第一场
- ios 开发 向工程中添加文件夹及文件 找不到头文件
- 爬虫 博客 增加访问量 Jsoup Java 正则 实现
- Sierpiński 的初等数论问题