蓝桥杯————23年省赛 ——————平方差

news2025/3/18 6:25:51

3.平方差 - 蓝桥云课

一开始看题我还没有意识到问题的严重性

我丢,我想 的是用两层循环来做,后来我试了一下最坏情况,也就是l=1 r = 1000000000

结果运行半天没运行出来,我就知道坏了,孩子们,要出事,结果又试了一下l = 1 r=1000 

结果很快就出来了,我把r改成了10000 也出来了,改成1000000的时候就半天也算不出来,超级超时
 

package xunhuan;

import java.util.Map;
import java.util.Scanner;

/**
 * @author zb
 * date2025/3/17 15:57
 */
public class L3502 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);


        int l = in.nextInt();
        int r = in.nextInt();
//        统计满足条件的个数
        int cnt =0 ;

//        ijk分别代表三个数xyz
        for (int i = 0; i <=r ; i++) {
            for (int j = i; j <=r ; j++) {
                long sum = (long) (j-i)*(j+i);
//                    如果这个差值在l r的范围内就++
                if(sum>=l&&sum<=r){
//                    System.out.println(i);
//                    System.out.println(j);
                    cnt++;
                }
            }
        }
        System.out.println(cnt);
                in.close();;
    }
}

奇怪的是一个点没有通过,真的有点奇怪呀,去看一下解析,我丢

去b站看了一下[蓝桥杯]真题讲解:平方差 (打表+数学)_哔哩哔哩_bilibili这个视频

我丢,我没有意识到 如果输入的数据1e9 意味着即使输出的复杂度为o(n也会超时)

所以要么用O(logn)复杂度输出要么用O(1)复杂度来解决,

O(1)的复杂度只能是你找到数学规律,也就是直接套公式得出答案

而O(logn)的话就只能通过降低复杂度来实现

这道题考察的是数学,直接枚举找规律,也叫打表

就是我先计算100以内的等于两个数的平方差的数有那些,下面用Java来实现

利用treeMap来实现便利100以内的等于两数平方差的数有那些,然后总结规律

package xunhuan;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

/**
 * @author zb
 * date2025/3/17 15:57
 */
public class L3502 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);


//        int l = in.nextInt();
//        int r = in.nextInt();
//        统计满足条件的个数
        int cnt =0 ;
           Map<Integer,Integer> mp = new TreeMap<>();
//        ijk分别代表三个数xyz
        for (int i = 1; i <=100 ; i++) {
            for (int j = 0; j <=100 ; j++) {
                int sum = i*i - j* j;
//                    如果这个差值在l r的范围内就++
                for (int k = 0; k <=100 ; k++) {
                    if(sum==k){
//                        if(k%2==0){
                            mp.put(k,0);
//                        }


//                        if(mp){
//
//                            System.out.println(sum);
//                        }

                    }
                }
            }
        }
        for (int key :mp.keySet()) {
            System.out.println(key);
        }
//        System.out.println(cnt);
                in.close();;
    }
}

得到之后,我们发现,欸,好像奇数全都是,再看一下偶数,看偶数的话就把这里的注释去掉就行

偶数如图所示

你发现了什么是不是每一个偶数都是4的倍数(包括0)

你要是不信的话再试一下奇数如图所示

所以我们可以得出范围[l,r]之内的所有的奇数和4的倍数都是满足条件的

我们总结一下

区间【1,r】的奇数个数和偶数个数,因为l,r>=1

奇数:比如【1,3】 奇数 1  3 两个

【1,2】奇数个数1, 一个

是不是恰好等于(1+r)/2 不信的话再试一下

这里也可以理解为上取整

偶数个数的话:

【1,7】是不是只有一个数 是4 

所以偶数个数是r/4

[1,r]的满足条件的个数为(r/4+(1+r)/2)

区间【1,l-1】的话是不是也是同理 ,奇数的个数直接把r换成l就行了4 的倍数不能动

【1,l-1】中满足条件的个数为((l)/4+(1+l-1)/2)

那么区间【l,r】之间的满足条件的个数是不是就等于区间【1,r】上面满足条件的个数减去【1,l-1】区间满足条件的个数

ok话不多上,我们直接整活儿



import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

/**
 * @author zb
 * date2025/3/17 15:57
 */
public class Main {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);

        int l = in.nextInt();
        int r = in.nextInt();
//        [1,r]之间的等于平方差的数字的个数 -[1,l-1]之间的等于平方差的数字的个数
        int sum =  (1+r)/2+r/4 -((l)/2+l/4);

        System.out.println(sum);

        in.close();
    }
}

不好,孩子们,有一个点没过,不知道为啥

弄明白了

因为我们要求的是[1,l-1]之间的满足条件的偶数数量 应该是(l-1)/4而不是l/4

改不对了,我快疯了,啊啊啊啊

不是我想不明白为啥要改成long 啊,10的9次方int接收不了吗好逆天呀,这道题,我快疯了

package xunhuan;

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

/**
 * @author zb
 * date2025/3/17 15:57
 */
public class L3502 {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);

        Long l = in.nextLong();
        Long r = in.nextLong();
//        [1,r]之间的等于平方差的数字的个数 -[1,l-1]之间的等于平方差的数字的个数
        Long num1 = (1+r)/2 -l/2;
        Long num2 = r/4 - (l-1)/4 ;

        System.out.println(num1+num2);

        in.close();
    }
}

整了我快3个小时了

在 Java 中,int 类型的最大值是 2^31-1 = 2,147,483,647。当输入的 R 接近或超过 1e9 时,虽然 R 本身小于 int 的最大值,但中间运算可能导致溢出。以下是关键分析:

1. 当 R 接近 int 最大值时的溢出问题

假设 R = 2,147,483,647(即 int 的最大值):

int R = 2_147_483_647;
int term = (R + 1) / 2;  // R+1 = -2,147,483,648(溢出为负数)

2. 中间运算的溢出风险

在计算奇数的公式 (R + 1) / 2 - L / 2 中:

  • 如果 R 接近 int 最大值,R + 1 会溢出到负数范围。
  • 例如:
int R = 1_500_000_000;  // 1.5e9
int term = (R + 1) / 2;  // 750,000,000.5 → 取整为 750,000,000

3. 为何输入范围是 1e9 时仍可能出错?

题目规定输入 LR 的范围是 [1, 1e9],而 1e9 远小于 int 的最大值 2,147,483,647。因此,理论上 int 足够存储输入值。但若代码中有其他操作(如中间运算或错误处理),可能导致意外溢出。

5. 总结

数据类型优点缺点
int节省内存中间运算可能溢出
long避免溢出内存占用略高
  • 推荐使用 long:虽然题目输入范围在 int 内,但使用 long 更安全,避免潜在边界问题。
  • 关键原则:在涉及大数运算时,优先使用 long 或 BigInteger

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

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

相关文章

一、串行通信基础知识

一、串行通信基础知识 1.处理器与外部设备通信有两种方式 并行通信&#xff1a;数据的各个位用多条数据线同时传输。&#xff08;传输速度快&#xff0c;但占用引脚资源多。&#xff09; 串行通信&#xff1a;将数据分成一位一位的形式在一条数据线上逐个传输。&#xff08;线路…

自带多个接口,完全免费使用!

做自媒体的小伙伴们&#xff0c;是不是经常为语音转文字的事儿头疼&#xff1f; 今天给大家推荐一款超实用的语音转文字软件——AsrTools&#xff0c;它绝对是你的得力助手&#xff01; AsrTools 免费的语音转文字软件 这款软件特别贴心&#xff0c;完全免费&#xff0c;而且操…

Qt QML解决SVG图片显示模糊的问题

前言 在QML中直接使用SVG图片&#xff0c;使用Image控件加载资源&#xff0c;显示出来图片是模糊的&#xff0c;很影响使用体验。本文介绍重新绘制SVG图片&#xff0c;然后注册到QML中使用。 效果图&#xff1a; 左边是直接使用Image加载资源显示的效果 右边是重绘后的效果 …

【Linux我做主】基础命令完全指南上篇

Linux基础命令完全指南【上篇】 Linux基础命令完全指南github地址前言命令行操作的引入Linux文件系统树形结构的根文件系统绝对路径和相对路径适用场景Linux目录下的隐藏文件 基本指令目录和文件相关1. ls2. cd和pwdcdpwd 3. touch4. mkdir5. cp6. mv移动目录时覆盖写入的两种特…

Designing Dashboards with SAP Analytics Cloud

Designing Dashboards with SAP Analytics Cloud

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构&#xff0c;由12个功能板卡&#xff08;通信控制、信号采集、驱动执行等&#xff09;组成。系统维护阶段存在以下痛点&#xff1a; 低效的本地烧录机制&#xff1a;各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

《AI大模型趣味实战》 No3:快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下)

《AI大模型趣味实战》 No3&#xff1a;快速搭建一个漂亮的AI家庭网站-相册/时间线/日历/多用户/个性化配色/博客/聊天室/AI管家(下) 摘要 本文介绍了家庭网站V1.3版本的更新内容&#xff0c;主要聚焦于AI管家功能的优化与完善。V1.3版本对AI管家模块进行了全面升级&#xff0…

c++基础知识-图论进阶

一、拓扑排序 1、基础知识 1&#xff09;什么是拓扑排序 对一个有向无环图G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若&#xff0c;则u在线性序列中出现在v之前。 2&#xff09;拓扑排序的操作方法 重复执行…

[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决

Spring Boot服务CPU 100%问题排查&#xff1a;从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时&#xff0c;系统性能会急剧下降&#xff0c;甚至导致服务不可用。本文将通过真实代码案例&#xff0c;详细讲解如何快速定位问题根源&#xff0c;并提供解决方案。无…

1.6 极限存在准则

1.夹逼定理&#xff08;迫敛定理&#xff09; 1.1 数列型 1.1.1 准则 1.2 函数型 2. 两个重要极限

大华SDK协议在智联视频超融合平台中的接入方法

一. 大华SDK协议详解 &#xff08;一&#xff09;、大华SDK协议概述 大华SDK&#xff08;Software Development Kit&#xff09;协议是大华股份为开发者提供的一套软件开发工具包&#xff0c;旨在帮助开发者快速集成大华设备&#xff08;如摄像头、NVR、DVR等&#xff09;的功…

卓越的用户体验需要智能内容

摘要&#xff1a;这篇文章指出静态文档已无法满足现代用户的需求&#xff0c;而智能内容则是构建卓越用户体验的关键。文章从智能内容的定义、优势和实际应用等方面进行了详细阐述&#xff0c;并强调了企业应积极拥抱智能内容&#xff0c;以提升客户满意度、降低成本并创造新的…

【蓝桥杯】1124修建公路1(Kruskal算法)

思路 找到能够连通所有城市的最小树即可&#xff0c;可用Prim或Kruscal。 &#xff01;&#xff01;注意&#xff0c;m的范围是包括0的&#xff0c;可就是包含没有道路的情况&#xff0c;要单独输出0 code import os import sys# 输入 n,m map(int,input().split()) road …

传感云揭秘:边缘计算的革新力量

在当今快速发展的科技时代&#xff0c;传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体&#xff0c;通过虚拟化技术将物理节点转化为多个服务节点&#xff0c;为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…

Bigemap Pro 的三种地图下载方式

地图下载通常是是最基础但也最重要的任务之一&#xff0c;无论是进行空间分析、制作专题地图&#xff0c;还是进行数据可视化&#xff0c;高质量的地图数据都是不可或缺的。Bigemap Pro提供了三种地图下载方式&#xff0c;分别适用于不同的场景和需求。无论是免费版用户还是专业…

Python直方图:从核密度估计到高维空间解析

一、直方图的核心原理与数学本质 数据分布的视觉解码器 直方图&#xff08;Histogram&#xff09;是数据科学家的"分布显微镜"&#xff0c;通过将连续数据划分为等宽区间&#xff08;Bin&#xff09;&#xff0c;统计各区间的频数/频率&#xff0c;用相邻矩形条直观…

0基础 | 恒流源专题

目录 tip1&#xff1a;低端反馈​编辑 tip2: 恒流源电路的设计注意事项 tip3&#xff1a;三极管输出恒定电流受运放输出电流控制 tip4&#xff1a;高端反馈 基本逻辑&#xff1a; 当负端Vref不输入电压时&#xff0c; 当负端Vref输入电压时 tip1&#xff1a;低端反馈 判…

Webpack 前端性能优化全攻略

文章目录 1. 性能优化全景图1.1 优化维度概览1.2 优化效果指标 2. 构建速度优化2.1 缓存策略2.2 并行处理2.3 减少构建范围 3. 输出质量优化3.1 代码分割3.2 Tree Shaking3.3 压缩优化 4. 运行时性能优化4.1 懒加载4.2 预加载4.3 资源优化 5. 高级优化策略5.1 持久化缓存5.2 模…

【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f341;YOLOv8入门改进专栏&#x1f341; &#x1f341;如果再也不能见到你&#xff0c;祝你早安&#xff0c;午安&#xff0c;晚安&#x1f341; 【YOLOv8改进系列】&#xff1a; 【YOLOv8】YOLOv8结构解读…