【蓝桥杯集训5】递推专题(3 / 3)

news2024/9/29 15:31:33

目录

3777. 砖块 - 递推

1208. 翻硬币 - 递推

95. 费解的开关 - 递推 + 位运算


3777. 砖块 - 递推

3777. 砖块 - AcWing题库

题目:

思路:

要使所有砖块颜色一致,则要不全B,要不全W

则分情况讨论:全为白色和全为黑色

  • 全W:遍历1——n-1个砖块,如果遇到黑色砖块i,则将i和i+1的砖块颜色翻转
  • 全B:遍历1——n-1个砖块,如果遇到白色砖块i,则将i和i+1的砖块颜色翻转
  • 如果第n个砖块在全W情况不是白色且在全B情况不是黑色,说明无法使所有砖块颜色一致,输出-1
  • 如果全W情况,最后一个砖块是白色,说明可以
  • 如果全B情况,最后一个砖块是黑色,说明可以
import java.util.*;

class Main
{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int q=sc.nextInt();
        while(q-->0)
        {
            int n=sc.nextInt();
            String ss=sc.next();
            char[] s=ss.toCharArray();
            String tt=ss;
            char[] t=tt.toCharArray();
            
            int wres=0,bres=0;
            List<Integer> res1=new ArrayList<>(),res2=new ArrayList<>();
            
            for(int i=0;i<n-1;i++)
            {
                //变成全为白的情况
                if(s[i]=='B')
                {
                    s[i]='W';
                    if(s[i+1]=='B') s[i+1]='W';
                    else s[i+1]='B';
                    res1.add(i+1);
                    wres++;
                }
                
                //变成全为黑的情况
                if(t[i]=='W')
                {
                    t[i]='B';
                    if(t[i+1]=='W') t[i+1]='B';
                    else t[i+1]='W';
                    res2.add(i+1);
                    bres++;
                }
            }
            
            if(s[n-1]=='B'&&t[n-1]=='W') System.out.println(-1);
            else if(s[n-1]=='W')
            {
                System.out.println(wres);
                for(int x:res1) System.out.print(x+" ");
                if(wres!=0) System.out.println();
            }else if(t[n-1]=='B')
            {
                System.out.println(bres);
                for(int x:res2) System.out.print(x+" ");
                if(bres!=0) System.out.println();
            }
        }
    }
}

 

1208. 翻硬币 - 递推

活动 - AcWing

题目:

每次可以翻转两枚硬币
给出初始状态s1和需要达到的状态s2
求最少要多少次才能翻转成目标转态

思路:

因为题目保证一定有解

如果s1和s2在相同下标下正反不同,则翻转i和i+1的硬币,res+1

实际上,结果只要求输出最小翻转次数,因此每次只要翻转下一个硬币就可以了

import java.util.*;

class Main
{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        String s=sc.next();
        String t=sc.next();
        
        char[] s1=s.toCharArray();
        char[] s2=t.toCharArray();
        
        int cnt=0;
        for(int i=0;i<s.length()-1;i++)
        {
            if(s1[i]!=s2[i])
            {
                if(s1[i+1]=='*') s1[i+1]='o';
                else s1[i+1]='*';
                cnt++;
            }
        }
        System.out.print(cnt);
    }
}

 

95. 费解的开关 - 递推 + 位运算

活动 - AcWing

题目:

25盏灯排成一个 5×5 的方形。

每一个灯都有一个开关,游戏者可以改变它的状态。

每一步,游戏者可以改变某一个灯的状态。

游戏者改变一个灯会产生连锁反应:和这个灯上下左右相邻的灯也要相应地改变其状态。

我们用数字 1 表示一盏开着的灯,用数字 0 表示关着的灯。

给定一些游戏的初始状态,判断游戏者是否可能在 6 步以内使所有的灯都变亮

  • 如果在6步以内可以完成,输出最小步数
  • 如果无法在6步内完成,输出-1

思路:

枚举第0行的灯泡开关情况,00000~11111一共 2^{5} 种情况

通过第0行可以递归推出第1、第2……第4行的情况

也就是说一共有32种方案,在这些方案里求最小操作数即可

  • 如果当前行状态已经确定,如果存在位置【i,j】开关为0,则要使这个开关为1,需要按下一行【i+1,j】的开关
  • 注意:枚举32种情况时,都是对原方阵进行操作,所以需要用一个矩阵把原矩阵储存下来
  • 当递推完0~3行开关后,若最后一行开关全为1,则表示成功,更新最小操作数
import java.util.*;

class Main
{
    static int N=6;
    static int[][] reg=new int[N][N];
    static int[][] g=new int[N][N];
    static int[] dx={0,-1,1,0,0},dy={0,0,0,-1,1};
    
    public static 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<=4&&b>=0&&b<=4) g[a][b]^=1;
        }
    }
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int t=sc.nextInt();
        while(t-->0)
        {
            int res=10;
            
            //将测试样例原方阵存下来 因为要枚举32种情况 每次枚举的必须是原图
            for(int i=0;i<5;i++)
            {
                String s=sc.next();
                for(int j=0;j<5;j++)
                    reg[i][j]=s.charAt(j)-'0';
            }
            
            //枚举所有32种情况(00000~11111共2^5种情况)
            for(int op=0;op<1<<5;op++)
            {
                int cnt=0; //记录翻转次数
                
                //取出原矩阵
                for(int i=0;i<5;i++)
                    for(int j=0;j<5;j++) g[i][j]=reg[i][j];
                    
                //对第0行开关进行操作(这里按1开关或按0都可以)
                for(int i=0;i<5;i++)
                    if((op>>i&1)==0) 
                    {
                        turn(0,i);
                        cnt++;
                    }
                
                //递推出第1行到第4行的状态
                //如果第i行为0,则需要通过按第i+1行的相应位置将其变成1
                for(int i=0;i<4;i++)
                    for(int j=0;j<5;j++)
                        if(g[i][j]==0)
                        {
                            turn(i+1,j);
                            cnt++;
                        }
                
                //检查最后一行看是否全亮
                boolean f=true;
                for(int i=0;i<5;i++)
                    if(g[4][i]==0) f=false;
                
                if(f) res=Math.min(res,cnt);
            }
            if(res>6) res=-1;
            System.out.println(res);
        }
    }
}

 

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

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

相关文章

MariaDB 成功敲钟上市 | 它与 Navciat 缘起 10 年前

MariaDB 敲钟上市2022 年底&#xff0c;云数据库公司 MariaDB 与 Angel Pond Holdings 公司完成合并&#xff0c;并在纽交所上市。新公司更名为 MariaDB&#xff0c;MySQL 之父奋斗了13年终敲钟。这标志着 MariaDB 开启新篇章。无论从开源还是商业之路&#xff0c;都将成为业内…

整理了十个Python自动化操作,拿走就用

01OS模块相关一、遍历文件夹 批量操作的前提就是对文件夹进行遍历&#xff0c;使用os模块可以轻松的遍历文件夹&#xff0c;os.walk 遍历后产生三个参数&#xff1a; 当前文件夹路径 包含文件夹名称[列表形式] 包含文件名称[列表形式] 代码如下&#xff0c;大家可以根据自己的…

SpringCloudAlibab-nacos

一、介绍注册中心配置中心的整合SpringCloudAlibaba中文地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md下载地址&#xff1a;https://github.com/alibaba/nacos/访问&#xff1a;http://localhost:8848/nacos/二、使用1、添加依赖&…

[大邻域算法](MD)VRPTW常见求解算法--代码解析

相关链接&#xff1a; 【路径分割】序列分隔和路径提取的案例【算法】LNS(大邻域算法)和ALNS(自适应大邻域算法)(持更)Python实现(MD)VRPTW常见求解算法——自适应大邻域搜索算法&#xff08;ALNS&#xff09;,本文也是该篇的解析干货 | 自适应大邻域搜索(Adaptive Large Neig…

【每日一题Day121】LC1139最大的以 1 为边界的正方形 | 前缀和数组 + 枚举

最大的以 1 为边界的正方形【LC1139】 给你一个由若干 0 和 1 组成的二维网格 grid&#xff0c;请你找出边界全部由 1 组成的最大 正方形 子网格&#xff0c;并返回该子网格中的元素数量。如果不存在&#xff0c;则返回 0。 写了50分钟写出来了 思路是对的 但就是不够清晰 并且…

ACPI on ARMv8 Servers

文章目录前言一、Why ACPI on ARM&#xff1f;二、Kernel Compatibility三、Relationship with Device Tree四、Booting using ACPI tables五、ACPI Detection六、Device Enumeration七、Driver Recommendations参考资料前言 ARM64处理器除了可以用设备树&#xff08;DT&#…

V90伺服驱动器设置IP地址和PN设备名称的具体方法(2种)

V90伺服驱动器设置IP地址和PN设备名称的具体方法(2种) 1. 通过V-ASSISTANT软件进行配置 首先下载并安装V-ASSISTANT软件,然后将V90通过网线连接到电脑上,注意此时电脑使用的网卡,不能选择无线网卡, SINAMICS-V90伺服调试软件V-ASSISTANT_V1.07.01 打开V-ASSISTANT软件,…

Java 基础面试题——面向对象

目录1.面向对象和面向过程有什么区别&#xff1f;2.面向对象的有哪些特征?3.静态变量和实例变量有什么区别&#xff1f;4.Java 对象实例化顺序是怎样的&#xff1f;5.浅拷贝和深拷贝的区别是什么&#xff1f;5.1.浅拷贝5.2.深拷贝5.3.总结6.Java 中创建对象的方式有哪几种&…

Qt代码单元测试以及报告生成

简介 单元测试是所有测试中最底层的一类测试&#xff0c;是第一个环节&#xff0c;也是最重要的一个环节&#xff0c;是唯一一次有保证能够代码覆盖率达到100%的测试&#xff0c;是整个软件测试过程的基础和前提&#xff0c;单元测试防止了开发的后期因bug过多而失控&#xff0…

< elementUi 组件插件: el-table表格拖拽修改列宽及行高 及 使用注意事项 >

elementUi 组件插件&#xff1a; el-table拖拽修改列宽及行高 及 使用注意事项&#x1f449; 资源Js包下载及说明&#x1f449; 使用教程> 实现原理> 局部引入> 全局引入 &#xff08;在main.js中&#xff09;&#x1f449; 注意事项往期内容 &#x1f4a8;&#x1f4…

Android Studio adb命令

Android Studio在IP连接142的手机进行无线调试 adb tcpip 5555 // 端口 adb shell ifconfig wlan0 //查看ip adb connect 192.168.1.142:5555 当已经连接上142这个ip&#xff0c;还想再连接其他143这个ip 方法如下&#xff1a; adb devices -l 查看当前设备 adb …

直接下载docker镜像包

这周正在做APIcat的企业版研发&#xff0c;准备适配阿里云的计算巢提供企业直接云安装的功能&#xff0c;顺便把原来写过的一个直接下载docker镜像包的小程序挂到了Gitee上面&#xff0c;有需要的可以点击下载 https://gitee.com/extrame/dgethttps://gitee.com/extrame/dget …

安灯呼叫系统助力企业实现精益管理

在当前的生产企业管理过程当中&#xff0c;生产现场难免会出现各种异常情况影响生产&#xff0c;乳设备需要机修、品质问题、物料呼叫等各种情况&#xff0c;在以往这些问题出现过后处理的方式都是些申请单&#xff0c;由人工到各个部门去给领导签字&#xff0c;浪费大量时间沟…

【Unity VR开发】结合VRTK4.0:远距离抓取物体

语录&#xff1a; 我们都生活在阴沟里&#xff0c;但仍有人仰望星空。 前言&#xff1a; 空间场景中的一个常见问题是试图抓取一个无法触及或太远而无法到达的对象。VRTK提供了一种简单的方法来实现这种技术&#xff08;Interactions.PointerInteractors.DistanceGrabber&…

上市公司每股社会贡献值(数据+代码)(2000-2020年)

数据来源&#xff1a;自我整理 时间跨度&#xff1a;2000-2020年 区域范围&#xff1a;上市公司 指标说明&#xff1a; 每股社会贡献值( 净利润所得税费用营业税金及附加支付给职工以及为职工支付的现金本期应付职工薪酬-上期应付职工薪酬财务费用捐赠-排污费及清理费) / 期…

MySQL服务器体系架构 执行原理

前言 前边我们了解了MySQL采用客户端/服务器架构&#xff0c;用户通过客户端程序发送增删改查需求&#xff0c;服务器程序收到请求后处理&#xff0c;并且把处理结果返回给客户端。这篇文章主要看下MySQL服务端是如何处理客户端的请求&#xff0c;感兴趣的小伙伴们可以参考借鉴…

【单目标优化算法】烟花优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

定时器设计

定时器设计 定时器应用&#xff1a; 游戏的Buff实现&#xff0c;Redis中的过期任务&#xff0c;Linux中的定时任务等等心跳检测&#xff0c;如服务器接收队列满了&#xff0c;tcp客户端会定时探测是否能够发送数据 定时器数据结构选取要求&#xff1a; 需要快速找到到期任务…

防火墙设置实验(12)

预备知识防火墙基本原理 防火墙是一种访问控制技术&#xff0c;位于可信与不可信网络之间&#xff0c;通过设置一系列安全规则对两个网络之间的通信进行控制&#xff0c;检测交换的信息&#xff0c;防止对信息资源的非法存取和访问。防火墙分为软防火墙和硬防火墙&#xff0c;一…

关于分布式的一些基础知识

1、分布式锁 (ngix,zoomkeeper,raft,kafka) 在单机场景下&#xff0c;可以使用语言的内置锁来实现进程或者线程同步。但是在分布式场景下&#xff0c;需要同步的进程可能位于不同的节点上&#xff0c;那么就需要使用分布式锁。 为了保证一个方法或属性在高并发情况下的同一时间…