jjzjj

去年的蓝桥杯H题杨辉三角形你满分了吗?

笨笨的小怂宝 2023-04-13 原文

直接看题:

其实和普通的杨辉三角一样,唯一不一样的是,这次变成了求某个数所在的位置,可是为什么那么多人无法得到分,或者只能骗分呢?简单说就是方法不对。

解析:

先看一下下面这个,是杨辉三角的前8行数据

1    0    0    0    0    0  0  0  0  0  0  0
1    1    0    0    0    0  0  0  0  0  0  0
1    2    1    0    0    0  0  0  0  0  0  0
1    3    3    1    0    0  0  0  0  0  0  0  0  0  0
1    4    6    4    1    0  0  0  0  0  0  0  0  0  0  0
1    5    10  10  5    1  0  0  0  0  0  0  0  0  0  0  0
1    6    15  20  15  6  1  0  0  0  0  0  0  0  0  0  0  0
1    7    21  35  21  7  1  0  0  0  0  0  0  0  0  0  0  0

第一列:永远为1

第二列:从0开始的递增序列

第三列:1+2+3....的累加序列

分析:

第一列始终为1,不管;

第二列为n-1,也不管(你总不可能定义一个十亿行的数组对吧?)

那来看第三列,第三列的值为下图所示:

0
0+0
0+0+1
0+0+1+2
0+0+1+2+3
0+0+1+2+3+4
0+0+1+2+3+4+5
..........
0+0+1+2+........+n

那么,如果说第三列的数值大于10亿了,并且在这之前都没有出现过所需要的值,那么我们是不是就可以判定这个值在第n+1行的第二位数?

那么就有了一个公式:(1+n)*n/2+2;而如果你直接用这个公式的话,可以得50分:

对于这题,50%好像不算太少了,好多网上题解只有30%/40%,而代码确实一大串

有了这50%的基础,那么我们就可以知道,剩下 的数值都是在第三列大于十亿之前可以求得的

那么就得判断一下前面到底有多少行数据需要获取:

而0+0+1+2+...+n>1e9,把前面两个0去除就是一个等差数列,且差值为1

可以求得n为44721;那么加上前面的两个0,就是第44723行数据

为了防止不确定因素,我们给它定为44725可以吧?

那问题又来了,定义一个44725行的二维数组, arr[44725][44725]?

这当然不可能,这样的话会内存超限,那接下来该怎么写呢?

我们可以用记忆化的方法去写着一个代码

每一行都有n个值,第一行1个,第二行2个,第n行n个,那最大行数44725就有44725个数值

借助一下上面的图:

1    0    0    0    0    0  0  0  0  0  0  0
1    1    0    0    0    0  0  0  0  0  0  0
1    2    1    0    0    0  0  0  0  0  0  0
1    3    3    1    0    0  0  0  0  0  0  0  0  0  0
1    4    6    4    1    0  0  0  0  0  0  0  0  0  0  0
1    5    10  10  5    1  0  0  0  0  0  0  0  0  0  0  0
1    6    15  20  15  6  1  0  0  0  0  0  0  0  0  0  0  0
1    7    21  35  21  7  1  0  0  0  0  0  0  0  0  0  0  0

第二行的第二列的1,是不是等于第一行的第二列的0+第一行第一列的1?

第三行第三列的1,等于第二行第三列的0+第二行第二列的1;

第三行第二列的2等于第二行第二列的1+第二行第一列的1;

这样子是不是就是要用到一个二维数组了?

那我们换一个看法,第一行数据怎么变成第二行数据?

arr[1]=1;arr[2]=0;arr[3].......arr[n]=0;

第二列的值初始为0吧?第二行第二列的数是上面两个数的和对吧?

那就是0+arr[1]对吧,也就是arr【2】=0+arr【1】;

那arr【2】初始状态为0,是不是就可以写成:arr【2】=arr【2】+arr【1】?

那从第一行变成第二行后,怎么变成第三行?

arr【3】=arr【3】+arr【2】;

arr【2】=arr【2】+arr【1】;这样是不是就完事了?

那第n行:arr【n】=arr【n】+arr【n-1】;arr【n-1】=arr【n-1】+arr【n-2】........;

那么定义一个数组 ,n从1到44725运行一次判断,是否存在就可以获得正确解

确实,这样就是一个满分答案,但是你们自己看一下cpu运行时间

 接下来讲的,有兴趣就看看,没兴趣直接拉底有代码

我们知道,杨辉三角是上行两数和,那么我们现在要看看它什么时候会出现超过十亿的值?

看上图我们可以知道 当运算到第三十四行的时候,就已经出现了大于10亿的值,位置是第16位,所以我们可以求得,每一次运算最多运算16个数值(杨辉三角对称原因,只求一半)

所以我们就可以求得,第n行最多要求的值为n-16------n这16个值

所以更改了代码

下面是代码块,分为两个,前面的是普通,cup长,一个是优化,费脑

代码一:

import java.util.Scanner;
public class 杨辉三角 {
    public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
        long n = scan.nextLong();//输入值,查找
        long[] arr =new long[44725];
        arr[0]=1;
        long k=1L;//k来定义位置
        if (n == 1) {
            System.out.println(1);
            return;
        }
        for (int i = 1;i<44725; i++) {
            for (int j = i; j>=1; j--) {
                arr[j] += arr[j - 1];//换行后,进行运算,减少内存
                if (arr[j] == n) {
                    System.out.println(k + i-j + 1);
                    return;//如果找到了就结束
                }
            }
            k+=(i+1);//每一行有i个值
        }
        System.out.println(((1 + n) * n / 2) + 2);
    }
}

代码二:

import java.util.Scanner;
public class 杨辉三角 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        long n = scan.nextLong();
        long[] arr =new long[44725];
        arr[0]=1;
        long k=1L;
        if (n == 1) {
            System.out.println(1);
            return;
        }
        for (int i = 1;i<44725; i++) {
            for (int j = i; j>=i-16&&j>=1; j--) {
                arr[j] += arr[j - 1];
                if (arr[j] == n) {
                    System.out.println(k + i-j + 1);
                    return;
                }
            }
            k+=(i+1);
        }
        System.out.println(((1 + n) * n / 2) + 2);
    }
}

有关去年的蓝桥杯H题杨辉三角形你满分了吗?的更多相关文章

  1. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  2. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  3. ruby - instance_eval 的 block 参数 - 记录了吗?目的? - 2

    刚刚意识到instance_eval产生self作为关联block的参数(除了1.9.2版本中的错误:http://www.ruby-forum.com/topic/189422)1.9.3p194:003>classC;end1.9.3p194:004>C.new.instance_eval{|*a|a}=>[#]1.9.3p194:005>这是否在某处记录/规范?看着ruby-doc:BasicObject,看不到提到的任何block参数。除了一些纯粹的历史原因之外,是否还有其他原因明确地传递它,而它自己总是被定义?我被这个击中的方式是:l=lambda{}myobj.instan

  4. ruby-on-rails - Rails 3.2.13 与 Rails 4.0.1 - 改变了吗?方法变了? - 2

    我最近注意到ActiveRecord对象上的方法changed?在Rails3.2.13和Rails4.0.1之间发生了变化。问题在于连接到数据库中整数字段的字段。假设我的模型Model带有number整数字段:#Rails3.2.13m=Model.lastm.number#=>5m.number='5hello'm.number#=>5m.number_changed?#=>truem.changed?#=>truem.changes#=>{:number=>[5,5]}#Rails4.0.1m=Model.lastm.number#=>5m.number='5hello'm.nu

  5. ruby - 网站不再需要本地数据库了吗? - 2

    Ifthere'sabetterplacetoaskthis,pleaseletmeknow.每次我建立一个新的网站/博客/购物车/等等,我都会不断尝试做以下事情:将常用功能提取到可重用代码中(主要是Rubygems和jQuery插件)如果可能,将该gem转换成一个小型服务,这样我就不必为所涉及的对象处理数据库(服务,我指的是精简的东西,通常使用SinatraWebFramework和一些核心模型构建).我的假设是,如果我可以消除对本地数据库的依赖,从长远来看,这将使它变得更容易和更具可扩展性(在可重用性和可管理性方面可扩展,不一定是数据库/性能)。我不确定这是好假设还是坏假设。你怎么

  6. 十四届蓝桥青少组模拟赛Python-20221108 - 2

    十四届蓝桥青少组模拟赛Python-20221108T1.二进制位数十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。请问十进制整数2022在二进制中是几位数?print(len(bin(2022))-2)#运行结果:11T2.晨跑小蓝每周六、周日都晨跑,每月的1、11、21、31日也晨跑。其它时间不晨跑。已知2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?#样例代码1ls=[0,31,28,31,30,31,30,31,31,30,31,30,31]ans=0k=6foriinrange(1,13)

  7. 蓝桥杯 stm32 MCP4017 - 2

    本文代码使用HAL库。文章目录前言一、MCP4017的重要特性二、MCP4017计算RBW阻值三、MCP4017地址四、MCP4017读写函数五、CubeMX创建工程(利用ADC测量MCP4017电压)、对应代码:总结前言一、MCP4017的重要特性蓝桥杯板子上的是MCP4017T-104ELT,如图1。MCP4017是一个可编程电阻,通过写入的数值可以改变电阻的大小。重点在于6引脚(W),5引脚(B&#

  8. [蓝桥杯单片机]学习笔记——串口通信的基本原理与应用 - 2

    目录一、原理部分1、什么是串行通信(1)并行通信与串行通信(2)串行通信的制式(3)串行通信的主要方式  2、配置串口(1)SCON和PCON:串行口1的控制寄存器(2)SBUF:串行口数据缓冲寄存器 (3)AUXR:辅助寄存器​编辑(4)ES、PS:与串行口1中断相关的寄存器(5)波特率设置  3、串口框架编写二、程序案例一、原理部分1、什么是串行通信(1)并行通信与串行通信微控制器与外部设备的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。并行通信:数据的各位同时发送与接收,每个数据位使用一条导线,这种方式传输快,但是需要多条导线进行信号传输。串行通信:数据一位一

  9. ruby-on-rails - Rails 3 has_many 改变了吗? - 2

    我需要跟踪这样设置的关联的更改(添加和删除):has_many:listing_serviceshas_many:services,through::listing_services对于普通属性,最简单的方法是检查before_save或l.previous_changes[attribute]中的l.changes[attribute]>在after_save中。问题是,对于has_many属性,最好的方法是什么? 最佳答案 我没有使用changes方法。但我相信你总能使用魔法_changed?和_was:services.any

  10. 考勤刷卡 最大和 简单 蓝桥杯省赛 2022 - 2

    问题描述小蓝负责一个公司的考勤系统,他每天都需要根据员工刷卡的情况来确定每个员工是否到岗。当员工刷卡时,会在后台留下一条记录,包括刷卡的时间和员工编号,只要在一天中员工刷过一次卡,就认为他到岗了。现在小蓝导出了一天中所有员工的刷卡记录,请将所有到岗员工的员工编号列出。输入格式输入的第一行包含一个正整数n,表示一天中所有员工的刷卡记录的条数。接下来n行,每行包含一条刷卡记录,每条刷卡记录的格式为:HH:MM:SSID其中HH:MM:SS表示刷卡时间,HH为一个0到23之间的两位十进制整数(可能含前导0)表示时,MM为一个0到59之间的两位十进制整数(可能含前导0)表示分,SS为一个0到59之间的

随机推荐