FJ再也不用野蛮的方式为自己的奶牛编号了。他用一个B(1<=B<=16)位二进制编码给每头奶牛编号,并刻在奶牛耳朵上的金属条上。
奶牛希望自己给自己选择一个编码。于是,瞒着FJ,他们制造了一台机器。它可以在两个已经存在的ID之间进行XOR运算。
奶牛们希望用这台机器制造一个他们想要的编码,如果做不到的话也要与目标相差最小(不同的二进制位最少的新ID)  
给你一个已经存在的ID的集合(元素个数为E,1<=E<=100),目标ID。请你计算离目标ID相差最小的新ID。
如果有多个ID满足相差最小的条件,选择步数最少的那一个。如果还有多个,选择最小的那一个(奶牛至少要运行一次机器)。

这道题具有迷惑人心的力量~~   个人感受

刚拿到题感到很难,因为需要控制的东西太多,然后又想到xor的一堆性质,把自己弄得一团乱麻后,仔细想了想,发现这是一道bfs(QAQ);

但需要注意的一点是,如果有和最优编号直接相同的,题目上说的是一定会有操作,先要有一些对k,v,u的初始化,再bfs;

代码:(学校数据太水,一个有bug的代码直接过了)

提示:代码有bug;

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<cstdlib>
  6. #include<ctime>
  7. #include<vector>
  8. #include<algorithm>
  9. #include<queue>
  10. #include<map>
  11. using namespace std;
  12. #define LL long long
  13. const int maxn=;
  14. int n,m;
  15. int a[maxn],A;
  16. char s[maxn];
  17. void ch(int &x){
  18. x=;
  19. for(int i=n-;i>=;i--){
  20. x=x<<;
  21. if(s[i]=='')x++;
  22. }
  23. }
  24. int q[<<],tail=,head=,f[<<];
  25. int v,k=,u=;//v记录最优的序列,k记录最优序列与v的差值,u记录步数;
  26. int col(int x){
  27. int sum=;
  28. for(int i=;i<n;i++){
  29. if((x^A)&(<<i))sum++;
  30. }
  31. return sum;
  32. }
  33. void bfs(){
  34. int x=;
  35. while(++head<=tail){
  36. if(q[head]==-){
  37. for(int i=;i<=m;i++)q[++tail]=a[i],f[a[i]]=;
  38. continue;
  39. }
  40. x=q[head];
  41. for(int i=;i<=m;i++){
  42. if(f[x^a[i]]>f[x]+)f[x^a[i]]=f[x]+,q[++tail]=x^a[i];
  43. }
  44. }
  45. int y;
  46. for(int i=;i<<<n;i++){
  47. if(f[i]==)continue;
  48. y=col(i);
  49. if(y==k&&f[i]<u){
  50. v=i,k=y,u=f[i];continue;
  51. }
  52. if(y<k){
  53. v=i,k=y,u=f[i];continue;
  54. }
  55. }
  56. string d="";
  57. for(int i=;i<n;i++){
  58. if(v&(<<i))d+='';
  59. else d+='';
  60. }
  61. cout<<u<<endl<<d<<endl;
  62. }
  63. void init(){
  64. scanf("%d%d",&n,&m);
  65. scanf("%s",s);
  66. ch(A);
  67. for(int i=;i<=m;i++){
  68. scanf("%s",s);
  69. ch(a[i]);
  70. if(a[i]==A){
  71. printf("%d\n%s\n",,s);//此处有bug,可能出现
  72. return;//操作一次得到最优编号的序列
  73. }
  74. }
  75. for(int i=;i<<<n;i++)f[i]=;
  76. q[++tail]=-;
  77. bfs();
  78. }
  79. int main(){
  80. freopen("1.in","r",stdin);
  81. freopen("1.out","w",stdout);
  82. init();
  83. }

[usaco2003feb]impster的更多相关文章

  1. JZYZOJ1383 [usaco2003feb]impster 位运算 最短路

    http://172.20.6.3/Problem_Show.asp?id=1383  找能到达某个状态的最小操作数,然后把所有状态扫一遍即可,要额外判定一下起始就有的状态(如果起始里没有0那么这些状 ...

随机推荐

  1. mybatis-plus generator template 中的全部属性

    { "date": "2018-10-30", "superServiceImplClassPackage": "com.baom ...

  2. BZOJ2002弹飞绵羊

    动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...

  3. Css实现一个菜单导航

    提要:使用大div定位设置为relative,子div设置为absolute实现菜单下拉 实现代码: <!DOCTYPE html> <html lang="en" ...

  4. JavaWeb过滤器.监听器.拦截器-?原理&区别

    过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇. 1.拦截器是基于java的反射机制,过 ...

  5. Linux有问必答:如何检查Linux的内存使用状况

    -1. /proc/meminfo11% -2. atop20% -3. free29% -4. GNOME System Monitor35% -5. htop41% -6. KDE System ...

  6. require.js使用

    无可奈何,二开项目用了require.js! 一道槛是挨不过去了 require官网: http://requirejs.org/ require.js cdn: <script src=&qu ...

  7. C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

     标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...

  8. 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)

    两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于j ...

  9. viewState详解

    作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对 ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整 ...

  10. Python web 框架:web.py

    web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限 制的. web.py 安装: pip install web.py 下面开始我 ...