UVA565订披萨,每个人提几个条件,至少满足每个人的一个条件的方案
2015-11-03 22:35
465 查看
这题,虽然简单,但是毕竟本人比较渣,说一下心酸历程,看到这题想了下就去敲代码,各种找bug,AC不了,然后就去参考别人
的代码,发现别人都是用位运算来做的,当然位运算的做法比较巧妙,然后就模仿着写了一发位运算的,然后AC,然后总感觉我一开始的
代码能AC,就继续找最开始的代码的bug,随便除了组样例,竟然阴差阳错的找到了bug,然后迅速的改了就AC了,慢慢的都是心酸,但至少
我的提交在VJ上时间是最短的,这波不亏。找了四个多小时的bug,我也是够了。
先说下我这题的输入写的稍微有些麻烦的,看不下去的可以自己改下输入,下面贴上位运算和dfs俩种方法的代码:
dfs:
位运算:
的代码,发现别人都是用位运算来做的,当然位运算的做法比较巧妙,然后就模仿着写了一发位运算的,然后AC,然后总感觉我一开始的
代码能AC,就继续找最开始的代码的bug,随便除了组样例,竟然阴差阳错的找到了bug,然后迅速的改了就AC了,慢慢的都是心酸,但至少
我的提交在VJ上时间是最短的,这波不亏。找了四个多小时的bug,我也是够了。
先说下我这题的输入写的稍微有些麻烦的,看不下去的可以自己改下输入,下面贴上位运算和dfs俩种方法的代码:
dfs:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<set> #include<cmath> #include<climits> #include<vector> #include<cfloat> #include<queue> #include<cctype> #include<cstdlib> #include<string> #define LL long long using namespace std; int b[20],a[20][20]; int l,flag; void dfs(int cur) { if(flag) return; if(cur==l) { cout<<"Toppings: "; for(int i=0;i<20;i++) if(b[i]==1) printf("%c",'A'+i); cout<<endl; flag=1; return; } for(int i=0;i<20;i++) { if(a[cur][i])<span style="white-space:pre"> </span>//就是这里一开始写的简单了,注意前面有和这个一样的要满足的条件的可以直接跳过。 { if(b[i]==a[cur][i]) dfs(cur+1); if(b[i]==0) { b[i]=a[cur][i]; dfs(cur+1); b[i]=0; } } } } int main() { string s; while(cin>>s) { flag=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); l=0; for(int i=1;i<s.length();i++) { int te=s[i]-'A'; if(s[i-1]=='+') a[l][te]=1; if(s[i-1]=='-') a[l][te]=-1; } l++; while(cin>>s&&s!=".") { for(int i=1;i<s.length();i++) { int te=s[i]-'A'; if(s[i-1]=='+') a[l][te]=1; if(s[i-1]=='-') a[l][te]=-1; } l++; } dfs(0); if(!flag) cout<<"No pizza can satisfy these requests."<<endl; } return 0; }
位运算:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<set> #include<cmath> #include<climits> #include<vector> #include<cfloat> #include<queue> #include<cctype> #include<cstdlib> #include<string> #define LL long long using namespace std; int b[20],a[20][20],yes[20],no[20]; int l,flag; int main() { string s; while(cin>>s) { flag=0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(yes,0,sizeof(yes)); memset(no,0,sizeof(no)); l=0; for(int i=0;i<(int)s.length()-2;i+=2) { int te=s[i+1]-'A'; if(s[i]=='+') a[l][te]=1; if(s[i]=='-') a[l][te]=-1; } l++; if(s!=".") { while(cin>>s&&s!=".") { for(int i=0;i<(int)s.length()-2;i+=2) { int te=s[i+1]-'A'; if(s[i]=='+') a[l][te]=1; if(s[i]=='-') a[l][te]=-1; } l++; } } for(int i=0;i<l;i++) { for(int j=0;j<16;j++) { if(a[i][j]==1) yes[i]|=(1<<j); if(a[i][j]==-1) no[i]|=(1<<j); } } flag=0; for(int i=0;i<(1<<16);i++) { int j; for(j=0;j<l;j++) { if((yes[j]&i)||((~i)&(no[j]))) continue; else break; } if(j==l) { cout<<"Toppings: "; int tem=i; int k=0; for(int k=0;k<16;k++) if(i&(1<<k)) printf("%c",'A'+k); cout<<endl; flag=1; break; } } if(!flag) cout<<"No pizza can satisfy these requests."<<endl; } return 0; }
相关文章推荐
- LeetCode Populating Next Right Pointers in Each Node (技巧)
- Android 使用dagger2进行依赖注入(基础篇)
- table隔行变色
- Python easy_install安装插件错误(UnicodeDecodeError)解决办法
- 视差特效
- Eclipse设置字体大小
- 分享个扫雷小游戏
- 二分查找
- 从头认识java-6.6 final(3)-方法
- 设计模式之抽象工厂模式
- MySQL Fabric 实践
- python与数据库
- 归并排序
- 从头认识java-6.6 final(3)-方法
- Win32修改ListView控件扩展属性
- [leetcode 172] Factorial Trailing Zeroes
- log4j配置
- 算数-分数和小数
- 命令行选择
- 五大常用算法之一:分治算法