[usaco2003feb]impster
2024-09-29 12:19:31
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();
}
最新文章
- 虚拟文件系统(VFS)
- 清北学堂模拟赛day7 数字碰撞
- ASP.NET、C#调用外部可执行exe文件--多种方案
- selenium grid解决多台电脑进行并发执行测试脚本
- linux 加载驱动后有permanent的解决办法
- Sum of Digits / Digital Root
- js获取几个月前,几周前时间。
- Eclipse 快捷键总结
- 不小心删掉root目录......
- HDU-1879-继续畅通工程(并查集)
- Java虚拟机栈和本地方法栈
- js数组中的find(), findIndex(), filter(), forEach(), some(), every(), map(), reduce()方法的详解和应用实例
- JavaScript 中的FileReader对象(实现上传图片预览)
- TCP 选项RST
- azkaban group分组,权限
- Css实现元素的垂直居中
- 关于Unity中Time.deltaTime的使用
- 个人作业Week7
- sqlserver如何添加全文索引
- 如何在Django1.6结合Python3.4版本中使用MySql
热门文章
- [翻译] NumSharp的数组切片功能 [:]
- Thread线程的基础知识及常见疑惑点
- 树讲解——紧急集合(lca)
- 359. Logger Rate Limiter
- ios使用http来上传图片实现方法
- Unity -- 入门教程三
- awk的求和计算使用;awk多个分隔符如何使用?
- jQeury入门:遍历
- Failure [INSTALL_FAILED_ALREADY_EXISTS]
- 解决Eclipse中C++代码显示Symbol &;#39;std&;#39; could not be resolved的问题