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

相关文章

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 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空