题解 P2622 【关灯问题II】
感觉大佬们的代码在读入上的处理比本蒟蒻优秀多了,于是,一个AFO蒟蒻弱弱地提出一下自己的看法
【分析】
首先,对于 \(n\) 那么小,肯定是状压啦
对于读入,本蒟蒻开了两个数组来储存每个按钮的效果:\(Open_i\) 和 \(Close_i\) 分别表示在按下第 \(i\) 个按钮后,它对于开着的开关和关闭的开关所造成的影响
那么我们分开来想:
如果一个状态 \(Set\) 中,为 \(1\) 的位表示开着的灯, \(0\) 表示关闭的
那么,对于关闭的灯,如果 \(Close_i\) 对它有影响,那么一定是将它开启
所以我们将 \(Close_i\) 能影响到的灯的状态直接打上 \(1\)
即如果开关效果为
1 0 -1 -1 0
那么我们将 \(Close_i\) 存为 \(00110_{(2)}=6_{(10)}\)
我们在使用它效果时则可以做到:
如果 \(Set\bigcup Close_i\),本身 \(Close_i\) 中为 \(0\) 的位不影响
\(Close_i\) 中本身为 \(1\) (即能影响到的位) 中,对于开着的,没有影响,对于关闭的,造成影响并打开
而对于 \(Open_i\), 它的效果恰巧反过来,如果开着,则一定关闭
因此,我们将能影响到的灯的状态打上 \(0\)
对于上面那组数据,我们将 \(Open_i\) 存为 \(01111_{(2)}=15_{(10)}\)
使用时,我们就可以直接这么做 \(Set\bigcap Open_i\)
这样可以保证对于 \(Open_i\) 中为 \(1\) 的位(即不能影响的位),不会造成影响
而对于会造成影响的位,如果本身是 \(0\) 的不会造成影响,而对于 \(1\) 的则关闭
完美地达到了要求
因此,我们初始化 \(Close_i\) 为空集,\(Open_i\) 为全集
如果读入第 \(i\) 个开关第 \(j\) 个灯为 \(1\) ,则 \(Open_i\) 去掉这一位,如果为 \(-1\) ,则 \(Close_i\) 加上这一位
使用时,对于每个状态 \(Set\) ,和第 \(i\) 个开关,它们能达到的状态就是 \(Set\bigcup Close_i\bigcap Open_i\)
而对于最小步,直接 bfs 即可,详情可以看本蒟蒻代码
【代码】
那本蒟蒻就放 我码风极丑的 代码了
#include<cstdio>
#include<cstring>
using namespace std;
#define f(a,b,c) for(register int a=b;a<=c;a++)
#define g(a,b,c) for(register int a=b;a>=c;a--)
#define Max(a,b) ((a>b)?a:b)
#define Min(a,b) ((a<b)?a:b)
typedef long long int ll;
typedef unsigned long long int ull;
inline ll read(){
register ll ans=0;register char c=getchar();register bool neg=0;
while((c<'0')|(c>'9')) neg^=!(c^'-'),c=getchar();
while((c>='0')&(c<='9')) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return neg?-ans:ans;
}//前面条件反射,莫管
int main(){
int N=read(),M=read(),U=(1<<N)-1;
int Close[110],Open[110],Minn[1<<10];
//Minn[i] 表示到状态 i 的最小步数
f(i,1,M) Close[i]=0,Open[i]=U;
f(i,0,U) Minn[i]=-1;
f(i,1,M)
f(j,1,N){
int Tmp=read();
if(Tmp==1) Open[i]^=1<<j-1;
else if(Tmp==-1) Close[i]|=1<<j-1;
}
int Queue[1<<10],Head=0,Tail=0;
Queue[Tail++]=U;
Minn[U]=0;
//一开始全部开着
while(Head<Tail){
int Set=Queue[Head++];
f(i,1,M){
int Tmp=Set&Open[i]|Close[i];
if(Minn[Tmp]>=0) continue;
//之前搜到肯定更优
Minn[Tmp]=Minn[Set]+1;
Queue[Tail++]=Tmp;
}
}
printf("%d",Minn[0]);
return 0;
}
最后安利一下 本蒟蒻的博客
题解 P2622 【关灯问题II】的更多相关文章
- P2622 关灯问题II(状压bfs)
P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...
- luogu p2622关灯问题II
luogu p2622关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[ ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- 洛谷 P2622 关灯问题II(状压DP入门题)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...
- P2622 关灯问题II (状态压缩入门)
题目链接: https://www.luogu.org/problemnew/show/P2622 具体思路:暴力,尝试每个开关,然后看所有的情况中存不存在灯全部关闭的情况,在储存所有灯的情况的时候, ...
- P2622 关灯问题II (状态压缩,最短路)
题目链接 Solution 这道题算是很经典的状压问题了,好题. 考虑到 \(n\) 的范围仅为 \(10\) , 那么也就是说所有状态压起来也只有 \(1024\) 种情况. 然后我们发现 \(m\ ...
- 洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...
- P2622 关灯问题II
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- 洛谷P2622 关灯问题II
洛谷题目链接 声明: 本篇文章不讲基础,对萌新不太友好,(我就是萌新),要学状压$dp$的请另寻,这篇文章只是便于本人查看.... 首先看到$n<=10$,就可以考虑状压了,要求最小值,所以初始 ...
- 洛谷P2622 关灯问题II (二进制枚举+bfs
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯——按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
随机推荐
- ACM-最优配餐
题目描述: 最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问 ...
- Redis数据类型及其操作
redis数据类型即操作 1. 字符串 set 设置字符串 格式: set key value 例子: set name kainhuck get 获取字符串的值 格式: get key 例子: ge ...
- 【剑指Offer】面试题32 - II. 从上到下打印二叉树 II
题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回 ...
- Maven项目工程目录
maven工程目录规范: src/main/java 存放项目的.java文件 src/main/resources 存放项目的资源文件,如spring.hibernate配置文件 src/t ...
- python 输出六行星号✳
for i in range(1,6): for j in range(5-i): print(" ",end=" ") for j in range(1,2* ...
- [转载]Jquery Chosen 插件动态生成option或重新绑定
$(".chosen—select").find("option[value='1']").attr("selected", "s ...
- 十四、JavaScript之不同类型变量相加
一.代码如下 二.效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...
- 四十一、在SAP中添加多条件选择框
一.代码如下: 二.其中我们的文本替换内容如下 三.需要注意的是波浪线的用法,以及区域的添加方法.运行程序,显示如下 四.不勾选时,查询出来是去掉国际的 五.勾选之后,查询的是全部的 六.显示如下 七 ...
- Spark 2.x 在作业完成时却花费很长时间结束
使用 Apache Spark 2.x 的时候可能会遇到这种现象:虽然 Spark Jobs 已经全部完成了,但是程序却还在执行.比如我们使用 Spark SQL 去执行一些 SQL,这个 SQL 在 ...
- 【CF1154G】Minimum Possible LCM
题意 给你 \(n\) 个数 \(a_i\) ,求出 \(\text{lcm}\) 最小的一对数. \(n\le 10^6, a_i\le 10^7\) 题解 直接枚举 ,找到当前数最小的两个倍数,统 ...