【ZJOJ1321】灯
题目
贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
问最少要按下多少个开关,才能把所有的灯都给重新打开。
数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。
分析
发现,当我们打开一个开关,就会取反一些灯的状态:0/1;
对于第i个开关,就可以有一个对其他灯是否有影响的n位的二进制数。
一开始,所有灯的状态为0,
现在要让他全部变为1,即\(2^n-1\)。
题目就转化为,n个二进制数,如何取最少的数使他们的异或中为\(2^n-1\)。
观察数据范围\(n\le35\)
直接枚举每个数选不选显然会超时。
考虑,我们每次只枚举n/2个,
先枚举前n/2个,将所有组合出的异或值扔进一个hash,或C++的map中(后者有点慢,为了方便,我打了map)
再枚举剩下的,所有组合出的异或值与\(2^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】灯的更多相关文章
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...
- S5PV210_流水灯
1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...
- 嵌入式Linux学习入门:控制LED灯
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
- c语言实现开灯问题
开灯问题: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依 ...
- <<你的灯亮着吗?>>读书笔记
本书是美国计算机传奇人物杰拉尔德.温伯格和唐纳德.高斯所著,我在网上买到的2003年版的本书,发现本书用20则幽默的现代寓言故事,60幅精美插图,以及一系列的适当提问和建议,让我们的思考方式慢慢得以扩 ...
- Windows on Device 项目实践 5 - 姿态控制灯制作
在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
- 佳能6d 魔灯
注意:由于魔灯团队因为开发理念的原因分成了魔灯和悲剧灯两个团队,新用户推荐直接刷魔灯的最新固件,请拉到顶楼最下方参考安装方法! 以下内容为历史版本的安装方法,为悲剧灯(原魔灯)团队开发! 百度网盘下载 ...
- Arduino 极速入门系列 - 光控灯(3) - 光敏电阻、与电阻分压那些事
继续是讲解基础原理,新手专用部分.这次讲光敏电阻,和用电阻分压.光电元器件有好几种,其中测光相关的元器件,常见的有光敏三极管和光敏电阻,我们这次光控灯用光敏电阻.在我们光控灯里面,将会使用它搭建出分压 ...
随机推荐
- 一张图包含SEO一切要点
看到一张好图 from http://www.rongyipiao.com/?p=8
- ROS自动切换策略
自动切换策略,具体如下 监视地址:1.1.1.1 轮询时间:30s:超时时间:1000ms up /ip firewall nat set [/ip firewall nat find comment ...
- screen重新连接会话
1.# yum -y install screen 2.# screen 3.# /usr/local/kibana/bin/kibana (具体使用案例) 然后按ctrl+a+d组合键,暂时断开s ...
- pandas的.columns和.index
可以通过.columns和.index着两个属性返回数据集的列索引和行索引 设data是pandas的一个DataFram类型的数据集. 则data.index返回一个index类型的行索引列表,da ...
- C++ 结构体重载运算符
听说这个东西有很多种写法什么的,来不及了(要退役了),先整一个之前用到的,可能用到的频率比较高的东西上来. struct node{ ll x,y; }; bool operator < (co ...
- redis内存满了怎么办?
redis最为缓存数据库,一般用于存储缓存数据,用于缓解数据库压力,但是缓存太多,内存满了怎么办呢.一般有以下几种方法 一.增加内存 redis存储于内存中,数据太多,占用太多内存,那么增加内存就是最 ...
- sql server ABS函数和PI函数
--ABS(x)返回x的绝对值 --PI()返回圆周率的值
- 如何解决 u盘 错误0x80071AC3:请运行chkdsk并重试
windows: 一.win+R 打开 cmd 二.确认好U盘在电脑上显示的盘符,输入代码:chkdsk G:/f (G为U盘所在盘符) Bonus:U盘一般会有文件系统,主要有NTFS.FAT16. ...
- git大全转
git原理:https://git-scm.com/book/zh/v2 http://blog.xiayf.cn/2013/09/28/learning-git-internals-by-examp ...
- 苹果浏览器和ios中,时间字符串转换问题
背景:在开发PC端项目和小程序时,遇到过一个时间字符串转化问题,在苹果浏览器和ios微信客户端里,"2018-10-15 18:20" 以 字符"-"拼接的时间 ...