我参考了这篇题解
Description
  贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!
  牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。
  每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。
  问最少要按下多少个开关,才能把所有的灯都给重新打开。
  数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。
Input
  第一行:两个空格隔开的整数:N和M。
  第二到第M+1行:每一行有两个由空格隔开的整数,表示两盏灯被一条无向边连接在一起。没有一条边会出现两次。
Output
  第一行:一个单独的整数,表示要把所有的灯都打开时,最少需要按下的开关的数目。
Sample Input
5 6
1 2
1 3
4 2
3 4
2 5
5 3
Sample Output
3
【题解】
首先可以知道每个开关最多按1次
那么可以dfs枚举每个开关是否按过,时间复杂度O(2^n)
因为n<=35,所以采用折半搜索,状态用二进制压缩后,再用hash存起来
后半部分的搜索完成后与对应的前半部分答案进行综合

Code:

const mo = 1234321;
varchoose:array[0..10000] of boolean;edge:array[0..1000000] of recordt,next:longint;end;power,head,h,dp,e:array[0..2000000] of int64;num,n,m,x,y,ans,n1,n2:int64;i,j:longint;procedure add(x,y:longint);begininc(num);edge[num].t := y;edge[num].next := head[x];head[x] := num;
end;function hash(x:int64):int64;beginhash := x mod mo;while (h[hash] <> 0) and (h[hash] <> x) do hash := (hash + 1) mod mo;
end;function min(x,y:longint):longint;beginif x < y then exit(x) else exit(y);
end;procedure dfs1(t:longint);
varx,sum,y:int64;i:longint;beginif t > n1 thenbeginx := 0;sum := 0;for i := 1 to n1 doif choose[i] thenbeginx := x xor e[i]; inc(sum);end;y := hash(x);if h[y] = 0 thenbeginh[y] := x;dp[y] := sum;end else dp[y] := min(dp[y], sum);exit;end;choose[t] := true;dfs1(t + 1);choose[t] := false;dfs1(t + 1);
end;procedure dfs2(t:longint);
varx,sum,y:int64;i:longint;beginif t > n thenbeginx := 0;sum := 0;for i := n1 + 1 to n doif choose[i] thenbeginx := x xor e[i]; inc(sum);end;y := hash(power[n] - 1 - x);if h[y] > 0 thenans := min(ans,dp[y] + sum);exit;end;choose[t] := true;dfs2(t + 1);choose[t] := false;dfs2(t + 1);
end;beginassign(input,'lights.in'); reset(input);assign(output,'lights.out'); rewrite(output);readln(n,m);for i := 1 to m dobeginreadln(x,y);add(x,y); add(y,x);//可以用邻接矩阵存图,我用了邻接表end;power[0] := 1;for i := 1 to 36 do power[i] := power[i-1] << 1;for i := 1 to n dobeginj := head[i];while j <> 0 dobegine[i] := e[i] + power[edge[j].t - 1];j := edge[j].next;end;e[i] := e[i] + power[i-1];end;dp[0] := 1;n1 := min(18,n);n2 := n;ans := maxlongint;dfs1(1);dfs2(n1 + 1);writeln(ans);close(input); close(output);
end.

【题解】JZOJ1321:灯相关推荐

  1. JZOJ1321 灯

    Description 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了.贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望. ...

  2. UVA11400 简单DP

    题意 有n种灯,每种灯分别需要电压v,电压为v的电源k元,每个灯c元,一共需要l个灯.为了节约电源费用,可以用高电压灯代替低电压灯.求采购灯和电源的最低费用. 题解 首先对灯按电压进行排序,dp[i] ...

  3. 【矩阵快速幂+高斯消元法】

    存两个板子 1.矩阵快速幂 拿这个题来记录一下矩阵快速幂的板子和写法 题意:有一行n头牛,从1-n报数,设第i头牛报的数为num[i],则nu m[1]=a,num[2]=b, num[i]=2*nu ...

  4. 题解 P1876 【开灯】

    题目链接 编者说得对 一道很明显的数学题,相信大家小学都做过. 通俗一点,就是找因数为奇数个的数.而这一类的数.明显的是平方数. 所以就是找n以内的平方数. 废话少说,直接上题解. #include& ...

  5. cogs 539. 牛棚的灯

    ★★☆   输入文件:lights.in   输出文件:lights.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 贝希和她的闺密们在她们的牛棚中玩游戏.但是天不从 ...

  6. Codeforces Round #521 (Div.3)题解

    A过水,不讲 题解 CF1077B [Disturbed People] 这题就是个显而易见的贪心可是我考场上差点没想出来 显然把一户被打扰的人家的右边人家的灯关掉肯定比把左边的灯关掉 从左到右扫一遍 ...

  7. 题意解读+详细题解-Leecode 319. 灯泡开关——Leecode每日一题系列

    今天是坚持每日一题打卡的第二十天 题目链接:https://leetcode-cn.com/problems/bulb-switcher/ 题解汇总:https://zhanglong.blog.cs ...

  8. 2019山东省赛B - Flipping Game ZOJ - 4114 题解

    题意: 初始有n个灯泡,灯泡状态是0和1,.现在有k轮操作,每次改变且仅改变m个的灯的状态,给定n盏灯的初始状态的最终状态,求有多少种解决改变灯的方案满足可以满足题目条件. 思路: 开始写的时候以为是 ...

  9. P1468 派对灯 Party Lamps(BIG 模拟)

    题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码. 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄 ...

最新文章

  1. Maven让资源文件处理插件能够解析资源文件中的Maven属性
  2. 简单点名小程序(伪)----android开发
  3. MVC4验证用户登录特性实现方法
  4. [Bugku][Web][CTF] 30-33 write up
  5. 怎么在mysql查询自己建的表格_oracle数据库中怎么查询自己建的表
  6. 互联生活:业务模式聚焦
  7. 【英语学习】【WOTD】fantod 释义/词源/示例
  8. vtk c++ 图像分割_医学图像分割-Attention Unet
  9. 软件开发计划_敏捷软件开发实践:估算与计划读书笔记125第23章 案例分析:Bomb Shelter Studio...
  10. 【HDU4312】Meeting point-2(切比雪夫距离和曼哈顿距离的转化+前缀和后缀和去绝对值)
  11. 【数据压缩(十)】H264文件分析2
  12. Linux之上传文件到服务器上
  13. java求职面试指南
  14. mac 命令修改dns服务器,MAC设置DNS的步骤
  15. 嵌入式linux机械臂,一款基于ARM嵌入式的机械臂的设计与实现
  16. facebook登陆,如何邀请玩家成为测试人员
  17. SaaSBase:什么是Teambition?
  18. java计算机毕业设计二手车商城源码+mysql数据库+系统+lw文档+部署
  19. Revit中栏杆扶手、坡道的绘制及插件太多问题
  20. 非线性降维方法 Isomap Embedding

热门文章

  1. 微软Visual Studio Code基本特征
  2. 电子绘画画笔笔刷模式的学习笔记
  3. 前窗玻璃膜贴了一周还有气泡_新车前挡风玻璃贴膜后有气泡几天能下去
  4. 【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解
  5. 一种MATLAB中解复杂方程(高次、指数、无解析解)的方法,可以在实现论文中公式时使用,solve函数。
  6. z390 黑苹果启动盘_黑苹果从入门到精通:K39小钢炮黑苹果实践
  7. 统计学与计算机考研学校排名,2018统计学考研院校排名
  8. oracle误删除表空间的数据文件
  9. mysql 回滚删除操作_Mysql如何快速回滚被删除的数据
  10. Google Bard vs ChatGPT:哪一个更适合创造富有创造性的文学作品?