牛客编程巅峰赛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

相关文章

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

IPython小白教程:提升你的Python交互式编程技巧,通俗易懂!

IPython是一个增强的Python交互式shell,它提供了丰富的功能和便捷的交互方式,使得Python开发和数据分析工作更加高效。本文将详细介绍IPython的基本概念、使用方法、主要作用以及注意事项。 一、IPython简介 1. IPython的起源 IPython由Fernando Pérez于2001年创建,旨在提供一个更高效的Python交互式编程环境。 2. IPyt

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D

剑指offer—编程题7(用两个栈实现一个队列)

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 代码如下: [java]  view plain copy print ? public class Test07 {       /**       * 用两个栈模拟的队列       *

Bootstrap 5 网格系统

Bootstrap 5 网格系统 Bootstrap 5 是目前最流行的前端框架之一,它提供了一套强大的网格系统,帮助开发者快速构建响应式布局。本文将详细介绍 Bootstrap 5 的网格系统,包括其工作原理、使用方法以及最佳实践。 什么是 Bootstrap 网格系统? Bootstrap 网格系统是一种基于 Flexbox 的布局方法,它允许开发者将页面内容分为多列,并且可以轻松地控制

剑指Offer—编程题4 ( 替换空格)

一、题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。    在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。

剑指Offer—编程题56(链表中环的入口地址)

题目:一个链表中包含环,如何找出环的入口结点? 解题思路   可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。    剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到