[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那么这些状 ...
随机推荐
- mybatis-plus generator template 中的全部属性
{ "date": "2018-10-30", "superServiceImplClassPackage": "com.baom ...
- BZOJ2002弹飞绵羊
动态树LCT模板题 #include<cstdio> #include<cctype> #include<algorithm> using namespace st ...
- Css实现一个菜单导航
提要:使用大div定位设置为relative,子div设置为absolute实现菜单下拉 实现代码: <!DOCTYPE html> <html lang="en" ...
- JavaWeb过滤器.监听器.拦截器-?原理&区别
过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇. 1.拦截器是基于java的反射机制,过 ...
- Linux有问必答:如何检查Linux的内存使用状况
-1. /proc/meminfo11% -2. atop20% -3. free29% -4. GNOME System Monitor35% -5. htop41% -6. KDE System ...
- require.js使用
无可奈何,二开项目用了require.js! 一道槛是挨不过去了 require官网: http://requirejs.org/ require.js cdn: <script src=&qu ...
- C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型
标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...
- 【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
两个月之前准备软考时,简单的从理论上总结了最经常使用的数据结构和算法,比方:线性表,链表,图.在进行java开发时,jdk为我们提供了一系列对应的类来实现主要的数据结构.jdk所提供的容器API位于j ...
- viewState详解
作者:Infinities Loop 概述 ViewState是一个被误解很深的动物了.我希望通过此文章来澄清人们对 ViewState的一些错误认识.为了达到这个目的,我决定从头到尾详细的描述一下整 ...
- Python web 框架:web.py
web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限 制的. web.py 安装: pip install web.py 下面开始我 ...