【ZJOJ1321】灯
题目
贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
牛棚中一共有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】灯相关推荐
- 黑马程序员 交通灯案例
---------------------- android培训.java培训.期待与您交流! ---------------------- 通过张老师的交通灯的例子我认识到了很多:首先是要结合现实生 ...
- 一步步玩pcDuino3--mmc下的裸机流水灯
第一部分是玩pcduino3下的裸机.这个过程能够让我们更好的理解嵌入式系统,熟悉我们使用的这个平台. 首先介绍下开发环境: 虚拟机:VMware® Workstation 10.0.2 build- ...
- [51单片机学习笔记ONE]-----LED灯的多种使用方法
一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间 ...
- 和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯
目录 1.PWM呼吸灯 2.亮度可调节灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/ca ...
- 和12岁小同志搞创客开发:手撕代码,做一款声控灯
机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...
- 和12岁小同志搞创客开发:手撕代码,做一款人体感应灯
目录 1.传感器原理 2.代码实践 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/categ ...
- 和12岁小同志搞创客开发:手撕代码,点亮LED灯
目录 1.Arduino编程架构 2.点亮LED灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_381069 ...
- 和12岁小同志搞创客开发:设计一款亮度可调节灯
机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.ht ...
- autoware中的交通灯识别(八)
autoware中的交通灯识别(八) 启动autoware $ cd ~/autoware.ai $ source install/setup.bash $ roslaunch runtime_man ...
最新文章
- android调试——教你用dumpsys命令调试
- Enum类的非一般用法汇总(工作中遇到时持续更新)
- 医失眠灵验方--五味子50g 茯神50g 合欢花15g 法半夏15g
- 全网最全 Python 操作 Excel 教程,建议收藏!
- 自定义View 中很关键的问题View获取宽/高是0 的解决办法
- win_redis【win下安装使用redis】
- 基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历
- mysql 分表_MySQL如何分库分表
- 收集分享有用的注册表项
- 敏捷开发流程下的测试(一)敏捷测试核心
- z tree 如何把选中的节点保存为标准的json格式_为什么MongoDB使用B-Tree?
- 3.abp框架code first方式创建表
- Atitit.异步编程的发展历史 1.1. TAP async/await
- 去重查询_花生AI论文去重V1.5更新永久免费
- CAD制图软件中如何设置CAD打印样式表(CTB)?
- box-sizing的属性
- 如何查看自己windows电脑的IP地址
- java----判断闰年和平年
- Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来
- 备考通信复试过程中的一些知识点总结梳理——移动通信系统Ⅱ