算法刷题day15

目录

  • 引言
  • 一、保险箱
  • 二、棋盘
  • 三、翻转
  • 总结

引言

今天还是三道新题,多练多想才会有出路。


一、保险箱

标签:状态机DP

思路:这道题看的我懵的很,大概意思就是每一位有三种状态 f [ i ] [ 3 ] f[i][3] f[i][3] 分别为借位、啥也不干、进位,然后从 i i i n n n 已经相等的最优方案数。然后有个判断条件 10 ∗ j = a [ i ] + k + t − b [ i ] 10*j = a[i] + k + t - b[i] 10j=a[i]+k+tb[i] ,就说明这是种解决方案,然后就循环遍历,找最小的就行。 其实自己

题目描述:

小蓝有一个保险箱,保险箱上共有 n 位数字。小蓝可以任意调整保险箱上的每个数字,每一次操作可以将其中一位增加 1 或减少 1。当某位原本为 9 或 0时可能会向前(左边)进位/退位,当最高位(左边第一位)上的数字变化时向前的进位或退位忽略。例如:
00000 的第 5 位减 1 变为 99999;
99999 的第 5 位减 1 变为 99998;
00000 的第 4 位减 1 变为 99990;
97993 的第 4 位加 1 变为 98003;
99909 的第 3 位加 1 变为 00009。保险箱上一开始有一个数字 x,小蓝希望把它变成 y,这样才能打开它,问小蓝最少需要操作的次数。输入格式
输入的第一行包含一个整数 n。
第二行包含一个 n 位整数 x。
第三行包含一个 n 位整数 y。输出格式
输出一行包含一个整数表示答案。数据范围
对于 30% 的评测用例,1≤n≤300;
对于  60%  的评测用例,1≤n≤3000;
对于所有评测用例,1≤n≤105,x,y 中仅包含数字 0 至 9,可能有前导零。输入样例:
5
12349
54321
输出样例:
11

示例代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1e5+10;int n;
char a[N], b[N];
int f[N][3];int main()
{scanf("%d%s%s", &n, a, b);memset(f, 0x3f, sizeof f);f[n][1] = 0;for(int i = n - 1; i >= 0; --i){for(int j = 0; j < 3; ++j)  //j表示向高位操作{for(int k = -9; k <= 9; ++k){for(int t = 0; t < 3; ++t)  //t表示向低位操作{if(a[i] + k + t - 1 - b[i] == (j-1) * 10)f[i][j] = min(f[i][j], f[i+1][t] + abs(k));}}}}printf("%d\n", min({f[0][0], f[0][1], f[0][2]}));return 0;
}

二、棋盘

标签:差分

思路:这就是一个差分的标准题,差分解决的是给[l,r]加上一个数,能实现O(1)的复杂度,这题只不过是二维的,不过也一样,忘了的话,可以看我之前的博客前缀和与差分

题目描述:

小蓝拥有 n×n 大小的棋盘,一开始棋盘上全都是白子。小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色,黑色棋子变为白色)。请输出所有操作做完后棋盘上每个棋子的颜色。输入格式
输入的第一行包含两个整数 n,m,用一个空格分隔,表示棋盘大小与操作数。
接下来 m 行每行包含四个整数 x1,y1,x2,y2,相邻整数之间使用一个空格分隔,表示将在 x1 至 x2 行和 y1 至 y2 列中的棋子
颜色取反。输出格式
输出 n 行,每行 n 个 0 或 1 表示该位置棋子的颜色。
如果是白色则输出 0,否则输出 1。数据范围
对于 30% 的评测用例,1≤n,m≤500;
对于所有评测用例,1≤n,m≤2000,1≤x1≤x2≤n,1≤y1≤y2≤n。输入样例:
3 3
1 1 2 2
2 2 3 3
1 1 3 3
输出样例:
001
010
100

示例代码:

#include <cstdio>
#include <iostream>using namespace std;const int N = 2010;int n, m;
int g[N][N];void insert(int x1, int y1, int x2, int y2)
{g[x1][y1] += 1;g[x2+1][y1] -= 1;g[x1][y2+1] -= 1;g[x2+1][y2+1] += 1;
}int main()
{scanf("%d%d", &n, &m);while(m--){int x1,x2,y1,y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);insert(x1,y1,x2,y2);}for(int i = 1; i <= n; ++i){for(int j = 1; j <= n; ++j){g[i][j] = g[i-1][j] + g[i][j-1] - g[i-1][j-1] + g[i][j];if(g[i][j] % 2 == 1) printf("1");else printf("0");}puts("");}return 0;
}

三、翻转

标签:思维题

思路:也不知道为什么是思维题,感觉挺简单的。就是变肯定两边不能变,然后就是依次从左往右枚举就行了。

题目描述:

小蓝用黑白棋的 n 个棋子排成了一行,他在脑海里想象出了一个长度为 n 的 01 串 T,他发现如果把黑棋当做 1
,白棋
当做 0,这一行棋子也是一个长度为 n 的 01 串 S。小蓝决定,如果在 S 中发现一个棋子和它两边的棋子都不一样,就可以将其翻转变成另一个颜色。也就是说,如果 S 中存在子串 101 或者 010,就可以选择将其分别变为 111000,这样的操作可以无限重复。小蓝想知道最少翻转多少次可以把 S 变成和 T 一模一样。输入格式
输入包含多组数据。
输入的第一行包含一个正整数 D 表示数据组数。
后面 2D 行每行包含一个 01 串,每两行为一组数据,第 2i−1 行为第 i 组数据的 Ti,第 2i 行为第 i 组数据的 
Si,Si 和 Ti 长度均为 ni。输出格式
对于每组数据,输出一行包含一个整数,表示答案,如果答案不存在请输出 −1。数据范围
对于 20% 的评测用例,1≤∑1Dni≤10;
对于所有评测用例,保证 1≤∑1Dni≤106,ni>0。输入样例:
2
1000111
1010101
01000
11000
输出样例:
2
-1

示例代码:

#include <cstdio>
#include <iostream>
#include <cstring>using namespace std;const int N = 1e6+10;int q;
char a[N], b[N];int main()
{scanf("%d", &q);while(q--){scanf("%s%s", b, a);int n = strlen(a);int res = 0;//cout << a[0] << " " << b[0] << " " << a[n-1] << " " << b[n-1] << endl;if(a[0] != b[0] || a[n-1] != b[n-1]) {printf("-1\n");continue;} for(int i = 1; i < n - 1; ++i){if(a[i] != b[i]){if(a[i-1] == a[i+1] && a[i-1] != a[i]){a[i] = b[i];res++;}else {res = -1;break;}}}printf("%d\n", res);}return 0;
}

总结

今天写了三道题分别是状态机DP、差分、思维题,有一说一这个状态机DP就是不好写,尤其遇到这种时间复杂度特别高的题目,一般都用dp或者贪心来做,本来以为是高精度问题,还专门把高精度加法、减法、比较写了一下,再一读题不是这样的,这种题没啥办法,只有多练才会。差分写这道题时,顺便把一维和二维和模板题做了,虽然会做,但是时间久了确实就忘了,就不会了,想起来了就有思路了,瞬间就会了。思维题还是经验一般都是从前往后遍历,前面的确定了后面的方案就是唯一的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…

【Linux】主机搭建 Linux服务器环境 笔记

目录 前言选择系统软件1. 用U盘装系统2. 安装 Centos7.93. 网络套件 应用软件1. ngnix2. 防火墙配置3. nodejs 后记 前言 过年买了个 mini 主机当玩具玩一下&#xff0c;这里记录下。 选择 已有主力机 (windows) 的情况下&#xff0c;使用过如下四种 Linux宿主环境。这里总…

【C语言必刷题】4. 打印100~200之间的素数

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

python中类属性与实例属性

类属性与实例属性的区别&#xff1a; 类属性&#xff1a; 是与类相关联的属性&#xff0c;在类级别上定义&#xff0c;对于所有该类的实例来说都是相同的。可以通过在类的内部直接定义赋值来创建类属性。 Example: class MyClass:class_attribute "This is a class a…

PaddleSeg分割框架解读[01] 核心设计解析

文章目录 PaddleSeg分割框架解读[01] 核心设计解析tools/train.pypaddleseg/cvlibs/config.pypaddleseg/cvlibs/builder.pypaddleseg/cvlibs/manager.pyPaddleSeg分割框架解读[01] 核心设计解析 tools/train.py import argparse import random import numpy as np import cv2…

Linux调优指南

更多相关知识可以阅读&#xff1a; https://www.yuque.com/treblez/qksu6c/yxl59pkvczqot9us https://www.yuque.com/treblez/qksu6c/nqe8ip59cwegl6rk 本文不会讲解基础知识。 CPU 设置调度器 这几个调度类的优先级如下&#xff1a;Deadline > Realtime > Fair 如果你…

频谱仿真平台HTZ Communications为私有5G建设铺平道路

韩国的国家监管机构韩国通信委员会&#xff08;KCA&#xff09;计划在德思特频谱仿真平台HTZ Communications的支持下加快扩大无线电接入范围&#xff0c;提升全国电信服务的质量和效率。 韩国通信委员会&#xff08;KCA&#xff09;在韩国的监管环境中扮演着至关重要的角色&am…

单例模式双端检测详解

正确写出doublecheck的单例模式_double check单例模式-CSDN博客

《C++ Primer Plus》《5、循环和关系表达式》

文章目录 1 for循环1.1for循环的组成部分1.2回到for循环1.3修改步长1.4使用for循环访问字符串1.5递增运算符和递减运算符1.6副作用和顺序点&#xff08;了解&#xff09;1.7前缀格式和后缀格式1.8递增/递减运算符和指针1.9组合赋值运算符1.10复合语句&#xff08;语句块&#x…

设计模式: 建造者模式

文章目录 一、什么是建造者模式二、建造者模式的结构三、使用场景案例分析1、使用场景2、案例分析 一、什么是建造者模式 建造模式通过一步一步的去构建一个复杂的对象。该模式将对象的构建细节封装在一个独立的建造者类中&#xff0c;使得客户端代码可以根据需要定制对象的构…

cRIO9040中NI9381模块的测试

硬件准备 CompactRIO9040NI9381直流电源&#xff08;可调&#xff09;网线 软件安装 下载地址 LabVIEW Real-Time 模块 NI CompactRIO 设备驱动程序 LabVIEW FPGA 模块&#xff08;可选&#xff09; 仅以下情况需要LabVIEW FPGA模块&#xff1a; 想为CompactRIO终端设计FP…

Gitlab操作流程

阶段1-构建账户信息 1.1 管理员分配账户 方式1-推荐 企业正常使用gitlab时&#xff0c;一般由项目经理(超级管理员)手动创建开发者账户信息&#xff0c;然后将账户发送给开发者&#xff0c;以便登录使用&#xff1b; 流程如下&#xff1a; 点击创建用户按钮&#xff1b; 创…

spring-orm:6 HibernateJpaVendorAdapter源码解析

版本 spring-orm:6.1.3 源码 org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter public class HibernateJpaVendorAdapter extends AbstractJpaVendorAdapter {// 旧版本Hibernate的方言类是否存在标识private static final boolean oldDialectsPresent Clas…

顶顶通实时质检系统如何添加词库

文章目录 前言联系我们步骤1. 导入系统预置词库2. 手动添加词库 在实时质检时如何质检到词库 前言 本篇文章主要讲解顶顶通实时质检系统如何添加词库。 词库添加的方式&#xff1a; 导入系统预置词库手动添加词库 联系我们 有意向了解实时质检系统的用户&#xff0c;可以点击…

邦芒支招:6个建议帮你找到合适的工作

说起来&#xff0c;今年找工作对很多毕业生确实不利&#xff0c;受大环境影响&#xff0c;很多小微企业难以为继&#xff0c;甚至大企业也在缩减人员&#xff0c;人才需求量总体降低了&#xff0c;但是&#xff0c;毕业生那么多&#xff0c;导致有一部分大学生迟迟找不到工作。…

web基础及http协议 (二) apache

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

[SSD 测试 1.3] 硬件测试之主控测试用例

专栏 《深入理解SSD》 主控制器方面,消费级市场的主要厂商包括三星、英特尔、西部数据、海力士和东芝,他们的产品涵盖了SATA和Nvme Pcie3.0/4.0接口。而在企业级市场,国内厂商华为海思H181x系列也有存在。在实际速度方面,该速度会受到制程及后端Nand Flash接口速率和通道数…

Postgresql源码(124)两个事务更新同一行数据时的行为和原理分析

XactLockTableWait函数、transactionid锁的一些原理和分析 结论 更新行时&#xff0c;会根据xmax拿transactionid锁&#xff0c;等对应的事务结束。 如果结束是回滚&#xff0c;则heap_update继续更新。如果结束时提交&#xff0c;则heap_update要返回上层ExecUpdate调用EvalP…

用Dockerfile创建PostgreSQL数据库

官网下载基本镜像 [rootlocalhost ~]# docker pull postgres:latest创建项目目录 [rootlocalhost ~]# mkdir /root/postgresql创建一个名为 “Dockerfile” 的文件 [rootlocalhost ~]# vim Dockerfile # 使用官方的PostgreSQL镜像 FROM postgres:latest# 设置环境变量&#…

10款ai文生图软件/网站推荐

1. Ai-Chat 推荐指数&#xff1a;⭐⭐⭐⭐ 链接&#xff1a; https://mmm.aiyujiang.com/ 上传图片并输入AI提示词就能一键生成各类动漫、卡通风格头像&#xff0c;算法强大&#xff0c;风格多样&#xff0c;一键开启你的AI自由创作之旅。有电脑版和手机版&#xff0c;也是很…