牛客编程巅峰赛S2第9场-倔强青铜组C题-牛牛和网格三角形

2023-11-22 14:10

本文主要是介绍牛客编程巅峰赛S2第9场-倔强青铜组C题-牛牛和网格三角形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

话说2020年12月15日晚8点,🐮客举行了一场程序猿间的巅峰对决,作为一个菜鸡程序猿的我,为了瞻仰大神们帅气的英姿,偷偷的参加了最强的倔强青铜组的比赛,第一题很简单,第二题不想看,第三题,嘿有意思!
由于当时没有做出来,就冥思苦想,然后看AC的代码,终于功夫不负有心人,终于做出来了!
下面给出题目的描述:

题目描述:

牛牛有一个长和高都为n(1≤n≤10 的10000幂)的网格三角形,牛牛想从从左下角点走到右上角点,但是牛牛只能向上或者向右沿着网格的边走,牛牛想知道从左下角点走到右上角点的方案数的奇偶性。牛牛现在给你n,请你告诉牛牛路径方案数的奇偶性,若是奇数返回true,若是偶数返回false。

示例:

示例图
输入:“5”
输出:false
—————————————华丽的分割线—————————————
初见此题,毫无头绪,再赏一帆,别有风味。
首先我想到了通过递归求解每个n的方案数,然后判断是奇数还是偶数,不过发现n太太大了,求解是不可能的。
然后我进一步想到了动态规划求解。但是n还是太大了,不过当n不是太大的时候,这题可以用动态规划做,也可以通过动态规划求解方案数,同时动态规划也是进一步解决该题的切入点,因此着重讲解动态规划的方法。
首先可以将网格看成二维空间的坐标系,每个点都有一个坐标,因此这道题就可以转换为从(0,0)点到(n,n)点的路径数了。
那路径数应该怎么求呢?
我们首先看整个二维空间下(0,0)点到(n,n)点的路径方案数,因为目标是(n,n)点,并且只能向右和向上走,因此f(n,n)=f(n-1,n)+f(n,n-1),如果不明白可以看下图:
公式求解示意
要到(n,n)点,可以从(n-1,n)点向上走一个单位,也可以从(n,n-1)点向右走一个单位,因此只要知道到达这两点的路径数就可以求出来了。
但是,可是,注意: 因为题中只有一半的空间,所以到(n,n)点的方式只有从(n-1,n)向上走一个单位的方法,因此f(n,n)=f(n-1,n);
同时我们可以很容易的看出,横坐标为0的点的路径都是1,即f(0,j)=1;
综上我们可以得到关系式如下:
公式
通过实现该公式,即可求出路径数,然后再判断奇偶,代码如下:

    public static int judge (String n) {// write code hereint num = Integer.valueOf(n);int[][] dp = new int[num+1][num+1];for(int i = 0 ; i <= num; i++) {dp[0][i] = 1;}for(int i = 1; i <= num; i++) {for(int j = i; j <= num; j++) {if(i!=j) {dp[i][j] = (dp[i-1][j]+dp[i][j-1])%2;}else {dp[i][j] = dp[i-1][j]%2;}}}return dp[num][num];}

为了计算结果能够保存,我将结果对2取模了,通过动态规划能够解决一部分,但是n是10的10000次方,创建dp数组就很占空间。
那怎么办呢?当然是向大神们学习了啊
通过看AC的大神代码,我发现他们并不是真的求出路径数后判断的,而是通过判断n的二进制码是否含有0来给出结果的。
我看到是一脸懵逼,为什么能够这样就给结果呢?
后来我看到讨论说到,只有当n为2的x次幂减1时,结果才是奇数。
同时看到大神们说通过dp打表得出的规律,为此我通过上面的程序,进行了打表(前32),得到结果如下:
打表图
我勒个去,还真是!
既然知道规律了,那就求解吧!下面首先给出程序代码:

    public boolean judge (String n) {// write code hereBigInteger bigInt = new BigInteger(n);//java中的大数类String str = bigInt.toString(2);//转换成2进制字符串for(int i = 0; i < str.length(); i++) {if(str.charAt(i)=='0') return false;//判断2进制串中是否有0}return true;}

上面的代码已经给出注释了,主要应用的是怎么判断一个数是不是2的x次幂减1,如果是,那么该数就可以通过下式表示:
在这里插入图片描述
下图是x=3为例的说明,当n=7时,n=2^3-1,应用二进制码进行运算的话如下图:
在这里插入图片描述
因此上述代码可以求得结果。

好了,不知道讲得对不对,如有错误欢迎指正。(感谢
酉衣进行的指正)

我是菜鸡程序猿,菜鸡程序猿就是我

这篇关于牛客编程巅峰赛S2第9场-倔强青铜组C题-牛牛和网格三角形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410687

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素