翻转问题(开关,开灯问题)求解技巧

开灯问题 题目描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯被打开,开着灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着? 输入 n和k,输出开着的灯编号。k≤n≤1000。 输出 输出开着的灯编号,行末没有多余空格 样例输入 7 3 样例输出 1 5 6 7 #include &lt... 阅读详情

翻转问题技巧详解

例.给定一个01串,现有翻转规则:翻转某一个位置时其后面2个位置也会跟着翻转,也就是每次翻转都会翻转3个连续的位置。要将01串全部翻转为0,求最小的翻转次数

形似这类题的问题叫做翻转问题,也可以叫开关问题,对于这类题通常都会用到下面我要说的方法来解


①.若某一个位置被翻转了n次,则其实际上被翻转了n%2次,因为翻转2k次相当与没翻转,翻转2k+1次相当于翻转了1次,因为要求最小翻转次数,所以对于某一个位置要么只(主动)翻转一次,要么不(主动)翻转。

②.分析易知翻转的顺序并不影响最终结果。(理解不了可自己举个例子在纸上模拟下)

③.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只有翻转它自己,因为没有其他位置的翻转会引起它的翻转。由①可知若第1个位置为1则必须且进行翻转(并将其后2个进行连带翻转)且以后不再进行翻转,因为再进行翻转就一共翻转了2次相当于没翻转。然后着眼于第2个位置,由于第1个位置不再进行翻转,所以要想翻转第2个位置只有翻转它自己,因为没有其他位置的翻转会引起它的翻转.....................以此类推直至最后剩下的个数<3个,因为每次都翻转3个,而剩下的少于3个了就不再进行考虑了,此时只需判断剩下的是否全为0的即可,若不全为0,则不存在全部翻转为0的方案


下面奉上几个题,当然赤裸裸套用上面方法是行不通的,在此基础上还需用到其他技巧

POJ-3276(翻转问题+二分搜索)

POJ-3279(翻转问题+位操作)

POJ-1753(和3279没啥区别!)

POJ-2965

题解报告请在我的分类-常用技巧精选中找一下吧!

2517 最少01翻转次数(前后缀和经典例题) 题目描述: 小b有一个01序列,她每次可以翻转一个元素,即将该元素从0变1或者从1变0。现在她希望序列不降,求最少翻转次数。 输入 第一行输入一个数n,其中1≤n≤20000; 第二行输入一个由‘0’和‘1’组成的字符串 输出 输出一个非负整数,表示翻转次数 输入样例 6 010110 输出样例 2 解题思路分析: 首先,他是一个01序列对吧 输入是这样的,没有空格隔开 所以我们只能用作字符串输... 阅读详情

相关推荐

LeetCode:1284. 转化为全零矩阵的最少反转次数 BFS

给你一个 m x n 的二进制矩阵 mat。 每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。) 请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。 二进制矩阵的每一个格子要么是 0 要么是 1 。 全零矩阵是所有格子都为 0 的...

AKGWSB 's blog 662

51Nod 2517 最少01翻转次数

题目传送门 思路: 求出字符串中的前缀和(即前i个字符中1的个数)。遍历一遍,令[0,i]变成0,[i+1,n-1]的位置变为1,比较每个i位置的翻转次数,取最小值。 AC代码: #include<iostream> using namespace std; int a[22000]; int main() { int n; strin...

ytuyzh的博客 665

[开关问题]01串翻转全变零 阿里笔试2020 Apare_xzc

[开关问题]01串翻转全变为零 Apare_xzc 问题描述:     有一个01串,长度为len(1<=len<=20),我们可以对这个字符串进行翻转操作,定义如下: 我们可以对字符串任意位置进行操作,操作后,此位置与其相邻的两个位置的字符改变(‘1’变’0’,‘0’变’1’)。 问最少翻转多少次这个字符串可以全部变为为’0’。输出最少步...

Apare_xzc的博客 4035

最少01翻转次数

2517 最少01翻转次数 2 秒 262,144 KB 5 分 1 级题 小b有一个01序列,她每次可以翻转一个元素,即将该元素异或上1。 现在她希望序列不降,求最少翻转次数。 收起 输入 第一行输入一个数n,其中1≤n≤20000; 第二行输入一个由‘0’和‘1’组成的字符串 ...

weixin_30621959的博客 1389

异或运算在状态翻转问题中的应用:从洛谷P1161开灯问题解析算法优化

在计算机科学中,异或运算是一种基础的位运算,其核心特性包括自反性和交换律,常用于数据校验、加密以及状态切换等场景。从原理上讲,异或运算能够实现状态的翻转与抵消,这使得它在处理“状态翻转找唯一”类问题时具有独特的优势。在工程实践中,这种特性可以显著优化算法的时间与空间复杂度,例如在大量数据中快速找出唯一出现奇数次的元素。应用场景广泛,包括算法竞赛中的经典问题、数据去重以及错误检测等。本文以洛谷P1161开灯问题为例,深入探讨如何利用异或运算的抵消性质,将复杂的模拟操作转化为高效的数学计算,从而避免大规模数组操

weixin_30363981的博客 422

算法竞赛入门经典第3章:开灯、蛇形填数、竖式问题详解

数组和字符串是C语言编程中最基础也最重要的数据结构,几乎所有程序都离不开对状态的存储与对文本的处理。理解数组如何连续存储数据、字符串如何以结束符管理长度,是掌握模拟算法和解决复杂题目的前提。无论是开关状态的翻转、矩阵填数的方向探测,还是将整数拼接为字符串后检索字符,背后都依赖数组遍历、边界判断和格式化输出等核心技巧。在算法竞赛入门题中,这些基础能力直接决定了能否准确实现题目逻辑,并避免越界、格式错误等问题。本文以算法竞赛经典教材中的三道例题为线索,逐步解析从暴力模拟到字符串处理的完整思路,帮助初学者跨越从会

weixin_33428613的博客 266

ny 77 开灯问题

#include int main() {     int n,k,i,j,a[1010];     while(scanf("%d%d",&n,&k)!=EOF)     {     for(i=1;i      a[i]=1;     for(j=2;j     {     for(i=j;i     {     if(a[i]==0)     a[i]=1;  

lc311309010103的专栏 382

开灯问题算法详解

本文介绍了一个经典的开关灯问题:n盏灯初始关闭,k个人依次操作编号为其倍数的开关。使用数组模拟灯的状态变化,通过双重循环模拟操作过程。最终输出开着的灯编号。算法时间复杂度O(k×n),空间复杂度O(n),适用于n≤1000的情况。示例展示了7盏灯3个人操作后的结果。还提供了可能的优化思路,如数学规律法和循环优化。

学无止境 1248

开灯问题的两种代码实现

有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。

2301_80387876的博客 313

基于LSTM的多变量温度预测(python从入门到入坑)

基于LSTM的多变量温度预测(python) ——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话) 这里写目录标题基于LSTM的多变量温度预测(python)——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话)一、我为什么要写这些?二、具体做了什么?三、源代码切块加注释,恳请批评指正(●’◡’●)ノ 一、我为什么要写这些? 因为让人抓狂的课程大作业,我小组选择了一个多变量预测方面的课题,在我这个大三基本上还没接触过Python数据处理,甚至对神经网络什么的都

代码之狐的博客 1万+

从放弃到再入门之拉格朗日对偶问题推导

普通同学的解法 无约束条件:求导就可以了 等式约束:代入消元,再求导 不等式约束:分情况讨论(在边界上和不在边界上),分别对应1,2的情况 然而发现,有些情况消元特别复杂,甚至不能求解 聪明同学的解法 发现:在最优点的情况下,约束曲面的法向量和目标函数的梯度反向必相同或相反 拉格朗日乘子法如何理解? (在2维里可以形象的解释为z=f(x,y)在约束条件g(x,y)=c中,极值...

qq_34564612的博客 1万+

nyoj 77-开灯问题 (倍数遍历)

77-开灯问题 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 ...

dggnqzt6462的博客 148

CS5511芯片实战:如何用DP转LVDS驱动高刷显示器(附配置代码)

本文详细解析了CS5511芯片在DP转LVDS高刷显示器驱动方案中的应用,包括核心架构、寄存器配置、时序优化及典型问题排查。通过实战案例和配置代码,帮助开发者快速实现120Hz高刷新率显示,特别适合医疗影像和工业HMI等严苛场景。

m3n5b7v8c9x的博客 1075

开灯问题模板

例题 POJ 1753 POJ 2965 模板 #include <iostream> using namespace std; char mp[5][5]; int minn = 0x7f7f7f7f; bool check() { //判断是否全开或全关 } void turn(int x, int y) { //翻转 } void change(int x, int y) { //翻转 } void dfs(int x, int y, int step) { i

Ego12138的博客 5883

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

FEniCS学习笔记01:centos7下通过conda安装FEniCSx0.7

2023年版本的Fenicsx0.7,官网推荐使用conda命令安装集成好的Python包,因此我们的安装思路是先安装Anaconda,再按照官网步骤安装Fenics。

huahua_xiao的博客 5056

灯海寻踪:开灯问题的C++精妙解法(洛谷P1161)

“开灯”通过无限路灯序列的开关操作(基于实数a和整数t的取整运算),要求找出唯一亮着的灯。解题需处理浮点数精度、无限序列优化及状态统计,核心思路包括:1)直接模拟法记录开关次数;2)位运算优化空间;3)数学法利用异或运算高效求解。关键点在于浮点数取整的精度补偿(如+1e-9)和奇偶次操作的判定(模2或异或)。优化策略涉及稀疏存储、分批处理及并行计算,适用于物联网、游戏开发等场景。题目融合数学建模与算法优化,训练浮点处理与状态管理能力,建议加强位运算和精度问题练习。(150字)

stillwatersss的博客 1297

Abaqus仿真突然中断?手把手教你解决SIGTERM/SIGINT报错(附完整命令行方案)

本文深入解析Abaqus仿真中因SIGTERM或SIGINT信号导致进程意外中断的根本原因,并提供了一套完整的命令行解决方案。通过将作业提交方式从图形界面切换到命令行,并配合关键参数设置,可以有效避免因会话空闲超时或外部干扰引发的计算中断,保障长时间仿真任务的稳定运行。

devops8pract的博客 746
上一篇: (水)POJ-2488字典序dfs
下一篇: (水)POJ-3083 按规定方向遍历方法
AC_hell
博客等级 码龄11年 65粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值