[usaco2003feb]impster
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的更多相关文章
- JZYZOJ1383 [usaco2003feb]impster 位运算 最短路
http://172.20.6.3/Problem_Show.asp?id=1383 找能到达某个状态的最小操作数,然后把所有状态扫一遍即可,要额外判定一下起始就有的状态(如果起始里没有0那么这些状 ...
随机推荐
- Truck History(最小生成树)
poj——Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27703 Accepted: 10 ...
- java布局(每个名字都是有意义的)
一.FlowLayout 1.流水布局:从左至右,排满换行 2.构造函数有三种: (1)FlowLayout() (2)FlowLayout(align) (3)FlowLayout(align, h ...
- SPOJ 8222 Substrings
题面 Description 给长度为 n 的字符串 S , 对任意的 L , 求长度为 L 的子串最多出现的次数. Input String S consists of at most 250000 ...
- VS2010 + WinDDK 搭建驱动开发环境(转)
因工作需要,需要研究一下Windows驱动开发.我们知道,编译驱动程序主要是通过两种方案:第一种是通过WinDDK提供的build命令+source文件进行编译:另外一种是通过VC的IDE进行编译. ...
- Leetcode总结之Union Find
package UnionFind; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; p ...
- dprobe and dprofile
https://github.com/xwlan dprofiler Lightweight CPU Memory I/O and Lock profiler for Windows dprobe D ...
- 【spring cloud】spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient的区别
- Oracle 实例名/服务名 请问SID和Service_Name有什么区别
可以简单的这样理解:一个公司比喻成一台服务器,数据库是这个公司中的一个部门. 1.SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字, 就好像一个部门里,每个人 ...
- Go语言 -- 获取命令行参数
部署golang项目时难免要通过命令行来设置一些参数,那么在golang中如何操作命令行参数呢?可以使用flag库和os库.1.flag库的使用 Go语言标准库提供了用于快迅解析命令行参数的flag包 ...
- Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
Ubuntu+Apache+PHP+Mysql环境搭建(完整版) 一.操作系统Ubuntu 14.04 64位,阿里云服务器 二.Apache 1.安装Apache,安装命令:sudo apt-get ...