《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
文章目录
- 题目解答
- 题目来源
题目解答
分析:
枚举第一行,指的是第一行哪些位置要切换状态!!!。第一行总共有5个数,组合数是32,即第一行哪些位置要切换总共有32种情况。这就是我们的枚举空间。比如,k = 0 表示第一行就这样,不切换状态。k = 2,二进制是 00010,就表示 数组g[][]的第一行第2个灯要切换状态。
这里的逻辑是:完成一件事A --> C ,拆分成两步,先从A --> B ,再从B – >C ,总共需要的花费就是两步之和。这里的A --> B 就是从g[][]变成第一行的新状态,需要的反转次数;这里的B – >C就是从第一行的新状态开始往下翻转,直到所有的灯都亮需要的反转次数。
采用的测试用例
00111
01011
10001
11010
11100
对了,这里对memcpy()
函数稍作解释
memcpy(dest, src, 字节数),指的是把src数组复制到dest数组,并且需要指定字节数。
比如
memcpy(backup, g, sizeof g); // 把g数组复制到backup数组
另外,这里解释一下异或操作,在代码中的体现是turn函数中用到了,把’0’变成’1’,把’1’变成’0’. 异或操作在配偶操作中很常见,是一种技巧,比如在求反向路径的时候。
char a = '0', b = a ^ 1;char c = '1', d = c ^ 1;cout << b << endl;cout << d << endl;/*
输出为
1
0
*/
这里的过程是这样的: ‘0’的Ascii值是48, 48 和1 异或(48的二进制表示是多少呢?然后如何求抑或呢?请读者自行验证。48 二进制: 110000 ,和1 异或得到 110001)得到的是49,正好是49,对应的字符是’1’.
ac代码
#include<bits/stdc++.h>
using namespace std;
const int INF = 100000000;char g[10][10];
int dx[5] = {0, -1, 0, 1, 0}, dy[5] = {0, 0, 1, 0, -1};// 反转灯
void turn(int x, int y){for(int i = 0; i < 5; i ++){int a = x + dx[i], b = y + dy[i];if( a >= 0 && a < 5 && b >=0 && b < 5){g[a][b] ^= 1;// 48 变成 49 即 '0'变成'1','1'变成'0'}}
}int work(){int ans = INF;// 枚举第一行哪些需要切换状态!// 第一行共有32种状态for(int k = 0; k < 1 << 5; k ++){int res = 0; // 统计翻转次数char backup[10][10];memcpy(backup, g, sizeof g); // g数组copy到backup数组中// 把g[][]数组按照枚举的第一行状态进行更改// 如果k的某一位为1,表示g[][]数组第一行的这些位要切换状态!// 然后依次往下递推,以便找到最少的步数。for(int j = 0; j < 5; j ++){if( k >> j & 1){res ++;turn(0, j);}}//逐行递推for(int i = 0; i < 4; i++)for(int j = 0; j < 5; j++){if( g[i][j] == '0'){res ++;turn(i + 1 , j);}}// 看最后一行是否全1bool is_successful = true;for(int i = 0; i< 5; i ++)if(g[4][i] == '0'){is_successful = false;break;}if(is_successful) ans = min(ans, res);memcpy(g, backup, sizeof backup);}if( ans > 6) ans = -1;return ans;
}int main(){int T;cin >> T;while( T --){for(int i = 0; i < 5; i ++) cin >> g[i];cout << work() << endl;}
}
题目来源
https://www.acwing.com/problem/content/97/
《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推相关推荐
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩
文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...
- 金字塔(算法竞赛进阶指南)
虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...
- 《算法竞赛进阶指南》数论篇
<算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...
- 《算法竞赛进阶指南(by 李煜东)》习题题解 集合
又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...
- CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)
算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...
- 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)
中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...
- AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】
AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...
- 算法竞赛进阶指南 骑士放置
4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...
- 算法竞赛进阶指南 萌新入门!
算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 作为一个想要入坑的算法的 ...
最新文章
- ​简单四步,快速判断真菌是否成功侵染宿主植物
- 分布式服务动态上下线感知
- math库是python语言的数学模块_Python 数学模块(Math)
- 不用到处找图标了!模库承包你所有的图标素材!
- views.py视图函
- C++ 不能在类体外指定关键字static
- 有关于类的定义赋值与调用总结
- 阿里云云计算 10 ECS的使用
- 菲波那切数列java_斐波那契数列—java实现
- 轴承系统动力学模型matlab程序代码
- Python3爬虫实战——QQ空间自动点赞程序(上)
- 微软私有云资源链接总结分享
- 拉格朗日插值公式与mathematica程序实现
- html图片左右滑动代码dw,DW图片无缝滚动代码
- 阿里天池大数据竞赛(杂)
- 软件配置一套键鼠控制两台电脑
- sinc插值原理及其实现
- 《打造高绩效团队》读书笔记
- 基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- SpringMVC-详解
热门文章
- 十天学会AngularJS之02
- UVA 10229 Modular Fibonacci
- 字符转十六进制 String = HEX using hexdump on linux
- 如何卸载Windows 7中的IE10并还原到IE9
- 本人常用的基础 linux命令
- centos7输入shell找不到命令_反弹shell原理与实现
- html空格代码_编写灵活、稳定、高质量的CSS代码的规范(推荐收藏)
- 【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现
- 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
- 2.3 快速搭建你的第一个系统,并进行迭代-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授