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;

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
#define LL long long
const int maxn=;
int n,m;
int a[maxn],A;
char s[maxn];
void ch(int &x){
x=;
for(int i=n-;i>=;i--){
x=x<<;
if(s[i]=='')x++;
}
}
int q[<<],tail=,head=,f[<<];
int v,k=,u=;//v记录最优的序列,k记录最优序列与v的差值,u记录步数;
int col(int x){
int sum=;
for(int i=;i<n;i++){
if((x^A)&(<<i))sum++;
}
return sum;
}
void bfs(){
int x=;
while(++head<=tail){
if(q[head]==-){
for(int i=;i<=m;i++)q[++tail]=a[i],f[a[i]]=;
continue;
}
x=q[head];
for(int i=;i<=m;i++){
if(f[x^a[i]]>f[x]+)f[x^a[i]]=f[x]+,q[++tail]=x^a[i];
}
}
int y;
for(int i=;i<<<n;i++){
if(f[i]==)continue;
y=col(i);
if(y==k&&f[i]<u){
v=i,k=y,u=f[i];continue;
}
if(y<k){
v=i,k=y,u=f[i];continue;
}
}
string d="";
for(int i=;i<n;i++){
if(v&(<<i))d+='';
else d+='';
}
cout<<u<<endl<<d<<endl;
}
void init(){
scanf("%d%d",&n,&m);
scanf("%s",s);
ch(A);
for(int i=;i<=m;i++){
scanf("%s",s);
ch(a[i]);
if(a[i]==A){
printf("%d\n%s\n",,s);//此处有bug,可能出现
return;//操作一次得到最优编号的序列
}
}
for(int i=;i<<<n;i++)f[i]=;
q[++tail]=-;
bfs();
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
}

[usaco2003feb]impster的更多相关文章

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

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

随机推荐

  1. 牛客网 Wannafly挑战赛5 B.可编程拖拉机比赛-ceil()函数+floor()函数

    可编程拖拉机比赛 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 “这个比赛,归根结底就是控制一 ...

  2. Java 基础【05】你的多继承纳?

    Java省略了许多很少用到,缺乏了解,混淆功能的C + +,在我们的经验中带来更多的悲伤大于收益 . -----James Gosling James Gosling 这个人大家应该很熟悉,就是最初设 ...

  3. Codeforces 536C Tavas and Pashmaks(凸壳)

    题目链接 Tavas and Pashmaks 题目大意:n个人比赛,游泳和赛跑,游泳距离S,赛跑R.每个人对应两个速度(陆地和水上的),如果存在S,R,使得第i个人胜利,那么输出i 题目要求输出所有 ...

  4. 359. Logger Rate Limiter

    /* * 359. Logger Rate Limiter * 2016-7-14 by Mingyang * 很简单的HashMap,不详谈 */ class Logger { HashMap< ...

  5. gitignore 规则

    在使用git的过程中,总有一些我们不想被跟踪的文件,例如vim的交换文件,编译产生的文件等等.这时,我们可以在项目的根目录下创建一个名为 .gitignore 的文件,列出不想被跟踪的文件模式即可.下 ...

  6. windows10 安装 mysql 5.6 教程

    首先是下载 mysql-installer-community-5.6.14.0.msi ,大家可以到 mysql 官方网去下载. win10的安全机制比较严格,安装前最好到<设置>--& ...

  7. django 实现下载功能

    from django.http import FileResponse def download(request): if..... file=open([path],'rb') response= ...

  8. mysql 导入sql文件时自动切换了大小写

    windows环境下: 解决办法(即将其改为大小写敏感): 在my.ini中添加 lower_case_table_names=1

  9. C++静态库与动态库深入研究

    什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操 ...

  10. Balanced Binary Tree——数是否是平衡,即任意节点左右字数高度差不超过1

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...