【vijos】【位运算】Miku_Nobody
来源:互联网 发布:开源推荐系统 python 编辑:程序博客网 时间:2024/06/08 20:07
描述
众所周知的(什么?你不知道?去百度一下),Nobody的团舞里有一个经典动作(那是相当的经典,经典了好几年),而这个动作是对称做两遍的.葱歌很喜欢这个动作(Mikuer们不要BS我…),她很想多做这个动作.
但是邪恶的F,为了少看这无语的动作,给了葱歌两排非负整数.一排A数,一排B数.A数有n个,B数有m个.如果一个A数和一个B数的二进制表示法中,每一位都不一样的话(不足的数高位补0),则A和B能够组成一个”对称音”.每个数只能属于一个”对称音”.葱歌想要最多的对称音,让她可以尽量多跳那个动作.
格式
输入格式
输入共3行.
第1行两个正整数n,m,表示A数n个,B数m个.
第2行n个非负整数,表示n个A数.
第3行m个非负整数,表示m个B数.
输出格式
一行一个正整数,表示最多能得到的”对称音”个数.如果一个对称音都得不到,输出”I want nobody nobody but you”.
代码
关键在位运算… 剩下的就是匈牙利算法模板。
#include <cstdio>#include <cstring>#include <cmath>#define INF 0x3f#define maxn 400using namespace std;int n,m,a[maxn],b[maxn],ans=0;bool w[maxn][maxn],vis[maxn];int match[maxn];bool judge(long long x){ x++; for(long long i=1;i<=x;i=(i<<1)) if(i==x) return 1; return 0;}bool find(int x){ for(int i=1;i<=m;i++){ if(w[x][i]&&!vis[i]){ vis[i]=true; if(match[i]==-1||find(match[i])){ match[i]=x; return true; } } } return false;} int main(){ freopen("in.txt","r",stdin); memset(w,0,sizeof(w)); memset(match,-1,sizeof(match)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++) scanf("%d",&b[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if (judge(a[i]+b[j])) w[i][j]=true; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(find(i)) ans++; } if(ans!=0) printf("%d",ans); else printf("I want nobody nobody but you"); return 0;}
0 0
- 【vijos】【位运算】Miku_Nobody
- vijos 1197 费解的开关 反向bfs+位运算
- Vijos P1201 高低位交换
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- 位运算
- iOS 开发中常用到的关于时间戳,UTC时间,时间字符串,NSDate的互相转换
- 第十一周--项目一--层次遍历算法1
- 171. Excel Sheet Column Number (Easy)
- 转载一篇关于makefile的文章
- 第十一周-项目一 验证算法(4)哈弗曼编码的算法验证
- 【vijos】【位运算】Miku_Nobody
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第十周项目一二叉树算法库
- ExecutorService中submit和execute的区别
- Linux内核--网络内核实现分析
- PIC单片机入门_定时器/计数器TMR1详解与实例
- Android动态库注入技术
- Mac 环境下 Android studio更新后出现 svn:E155036
- Solo 博客系统 1.7.0 发布 - 新版 MD 编辑器