题目

贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
  牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
  每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
  问最少要按下多少个开关,才能把所有的灯都给重新打开。
  数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。

分析

发现,当我们打开一个开关,就会取反一些灯的状态:0/1;
对于第i个开关,就可以有一个对其他灯是否有影响的n位的二进制数。
一开始,所有灯的状态为0,
现在要让他全部变为1,即2n−12n−12^n-1。
题目就转化为,n个二进制数,如何取最少的数使他们的异或中为2n−12n−12^n-1。
观察数据范围n≤35n≤35n\le35
直接枚举每个数选不选显然会超时。
考虑,我们每次只枚举n/2个,
先枚举前n/2个,将所有组合出的异或值扔进一个hash,或C++的map中(后者有点慢,为了方便,我打了map)
再枚举剩下的,所有组合出的异或值与2n−12n−12^n-1异或一下,将异或出来的值看一下map中有没有,如果有,则与ans取min。

#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
const int maxlongint=2147483647;
const int mo=1000000007;
const long long N=45;
using namespace std;
int n,m,ans,tot;
long long a[N],mi[N];
map<long long,int> arr;
void dg(int y,long long v,int dis)
{if(dis>ans) return;if(v==mi[n]-1) ans=min(ans,dis);else{if(arr[v]==0) arr[v]=dis;else arr[v]=min(arr[v],dis);}if(y>n) return;for(int i=y;i<=n;i++) dg(i+1,v^a[i],dis+1);
}
void dg1(int y,long long v,int dis)
{if(dis>ans) return;if(v==mi[n]-1) ans=min(ans,dis);else{tot++;if(arr[(mi[n]-1)^v]!=0) ans=min(arr[(mi[n]-1)^v]+dis,ans);}if(y>n/2) return;for(int i=y;i<=n/2;i++) dg1(i+1,v^a[i],dis+1);
}
int main()
{scanf("%d%d",&n,&m);mi[0]=1;for(int i=1;i<=36;i++) mi[i]=mi[i-1]*2,a[i]=mi[i-1];for(int i=1,x,y;i<=m;i++){scanf("%d%d",&x,&y);a[x]+=mi[y-1];a[y]+=mi[x-1];}ans=maxlongint;dg(n/2+1,0,0);arr[0]=0;dg1(1,0,0);printf("%d",ans);
}

【ZJOJ1321】灯相关推荐

  1. 黑马程序员 交通灯案例

    ---------------------- android培训.java培训.期待与您交流! ---------------------- 通过张老师的交通灯的例子我认识到了很多:首先是要结合现实生 ...

  2. 一步步玩pcDuino3--mmc下的裸机流水灯

    第一部分是玩pcduino3下的裸机.这个过程能够让我们更好的理解嵌入式系统,熟悉我们使用的这个平台. 首先介绍下开发环境: 虚拟机:VMware® Workstation 10.0.2 build- ...

  3. [51单片机学习笔记ONE]-----LED灯的多种使用方法

    一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间 ...

  4. 和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯

    目录 1.PWM呼吸灯 2.亮度可调节灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/ca ...

  5. 和12岁小同志搞创客开发:手撕代码,做一款声控灯

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...

  6. 和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

    目录 1.传感器原理 2.代码实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/categ ...

  7. 和12岁小同志搞创客开发:手撕代码,点亮LED灯

    目录 1.Arduino编程架构 2.点亮LED灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_381069 ...

  8. 和12岁小同志搞创客开发:设计一款亮度可调节灯

    机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. ​​​项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.ht ...

  9. autoware中的交通灯识别(八)

    autoware中的交通灯识别(八) 启动autoware $ cd ~/autoware.ai $ source install/setup.bash $ roslaunch runtime_man ...

最新文章

  1. android调试——教你用dumpsys命令调试
  2. Enum类的非一般用法汇总(工作中遇到时持续更新)
  3. 医失眠灵验方--五味子50g 茯神50g 合欢花15g 法半夏15g
  4. 全网最全 Python 操作 Excel 教程,建议收藏!
  5. 自定义View 中很关键的问题View获取宽/高是0 的解决办法
  6. win_redis【win下安装使用redis】
  7. 基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历
  8. mysql 分表_MySQL如何分库分表
  9. 收集分享有用的注册表项
  10. 敏捷开发流程下的测试(一)敏捷测试核心
  11. z tree 如何把选中的节点保存为标准的json格式_为什么MongoDB使用B-Tree?
  12. 3.abp框架code first方式创建表
  13. Atitit.异步编程的发展历史 1.1. TAP  async/await
  14. 去重查询_花生AI论文去重V1.5更新永久免费
  15. CAD制图软件中如何设置CAD打印样式表(CTB)?
  16. box-sizing的属性
  17. 如何查看自己windows电脑的IP地址
  18. java----判断闰年和平年
  19. Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来
  20. 备考通信复试过程中的一些知识点总结梳理——移动通信系统Ⅱ

热门文章

  1. iatf16949标准三大过程_IATF16949要求的过程、文件、记录汇总
  2. 适合理工直男的钟平老师逻辑英语学习笔记
  3. Linux 大数据(hadoop)
  4. 仿B站的视频评论列表
  5. 2021-03-23
  6. 如何输出一个某种编码的字符串?
  7. python 幂_python 幂次方
  8. 微信扫码登入 改变二维码样式
  9. Python爬虫尝试-爬取指定股票的财务报表(东方财富网)
  10. linux的crontab 命令,每三个月的月末执行一次