1221. 四平方和(超详细!!)

news2024/9/20 14:42:56

输入样例:

5

输出样例:

0 0 1 2

本题思路:以空间换时间
由于暴力解法我们至少要枚举三个数,然后计算出第四个数
呢么需要进行三重循环,时间复杂度大概为O(n3),则会超时
所以我们要进行优化来降低时间复杂度
我们的思路是:
将三重循环,拆解成两次二重循环
在第一次循环中,先计算c^2+d^2,然后记录下结果和此时的c,d的值
在第二次循环中,可以直接通过遍历a,b,查找t(t=n-a^2-b^2)
找到的第一组满足a^2+b^2+c^2+d^2=n,的便是字典序最小的,直接输出即可
最重要的怎样存储c^2+d^2?
可以考虑哈希表,也可以使用结构体数组+二分 

 哈希表(unordered_map现在数据加强了过不了,但是可以模拟哈希表)

#include<iostream>
#include<algorithm>
#include<cstring>//memset赋值的头文件
#include<cmath>//使用了sqrt开根号函数
using namespace std;
// typedef pair<int,int> PII;
const int N=5e6+10;

int n;
int r[N];
// c有根号N种可能,d也是所以组合起来,是2*根号N种<N
int main()
{
    cin>>n;
    
    memset(r,-1,sizeof r);
    //先将其附一个特殊值,也就是题目不会出现的值
    //由于a,c,b,d 肯定是>=0
    
    for(int c=0;c*c<=n;c++)
    {
        for(int d=c;c*c+d*d<=n;d++)//为了按字典序输出确保c<b
        {
            int t=c*c+d*d;
            if(r[t]==-1)//由于要求字典序最小,所以保留的是最先出现的值,如果之前赋值过则不需要再进行赋值
            {
                r[t]=c;
            }
        }
    }
    
    for(int a=0;a*a<=n;a++)
    {
        for(int b=a;a*a+b*b<=n;b++)
        {
            int t=n-a*a-b*b;
            if(r[t]==-1)//说明没有这组解
            continue;
            int c=r[t];
            int d=sqrt(t-c*c);//sqrt开根号的意思
            cout<<a<<' '<<b<<' '<<c<<' '<<d;
            return 0;
        }
    }
    return 0;
}

 结构体数组+二分 

#include<iostream>
#include<algorithm>//sort排序函数的头文件
using namespace std;
const int N=5e6+10;
struct Sum{
    int s,c,d;
    bool operator < (const Sum &t) const//重载<原因是应为,为了保证字典序
    {
        if(s !=t.s) return s < t.s;//如果这个s(c*c+d*d)之前出现过则就比较c和d
        if(c !=t.c) return c < t.c;//在s相同时,保证c最小
        return d<t.d;//在s和c相同时,保证d最小
    }
};

int n;
Sum r[N];

int main()
{
    cin>>n;
    int k=0;
    for(int c=0;c*c<=n;c++)
    {
        for(int d=c;c*c+d*d<=n;d++)
        {
            r[k++]={c*c+d*d,c,d};//{s,c,d},对应的
        }
    }
    
    sort(r,r + k);//使用的是重载的<号
    
    for(int a=0;a*a<=n;a++)
    {
        for(int b=a;a*a+b*b<=n;b++)
        {
            int t=n-(a*a+b*b);
            
            //找到t,由于里面也会有多个值为t但是我们要找到第一个,所以相当于找右条件(最小的大于等于t)的左边界
            int L=0,R=k-1;
            while(L<R)
            {
                int mid=L+R>>1;
                if(r[mid].s>=t) R=mid;
                else L=mid+1;
            }
            
            if(r[R].s==t)//如果找到,就直接输出
            {
                cout<<a<<' '<<b<<' '<<r[R].c<<' '<<r[R].d;
                return 0;
            }
        }
    }
    return 0;
}

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

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

相关文章

怎么学习C语言,才能快速掌握?

有多年软件行业经验&#xff0c;期间参与过多个C语言项目。要掌握一门编程语言&#xff0c;仅仅投入时间学习是不够的&#xff0c;关键在于实际项目经验。在没有真正实战经验之前&#xff0c;不宜轻易声称掌握某种编程语言&#xff0c;因为编程是积累性的工作&#xff0c;理论知…

需求太多处理不过来?MoSCoW模型帮你

一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法&#xff0c;以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词&#xff0c;代表&#xff1a; M&#xff08;Must have&#xff09;&#xff1a…

IDEA开启并配置services窗口

前言&#xff1a; 一般一个spring cloud项目中大大小小存在几个十几个module编写具体的微服务项目。此时&#xff0c;如果要调试测需要依次启动各个项目比较麻烦。 方法一&#xff1a; 默认第一次打开项目的时候&#xff0c;idea会提示是否增加这个选项卡&#xff0c;如果你没…

NIDEC COMPONENTS尼得科科宝滑动型DIP开关各系列介绍

今天AMEYA360对尼得科科宝电子滑动型DIP开关各系列参数进行详细介绍&#xff0c;方便大家选择适合自己的型号。 系列一、滑动型DIP开关 CVS 针脚数&#xff1a;1, 2, 3, 4, 8 安装类型&#xff1a;表面贴装&#xff0c;通孔 可水洗&#xff1a;无 端子类型&#xff1a;PC引脚(只…

Closure Table-树形多级关系数据库设计(MySql)

一般树形多级关系数据库设计&#xff0c;比较普遍的就是四种方法&#xff1a;&#xff08;具体见 SQL Anti-patterns这本书&#xff09; Adjacency List&#xff1a;每一条记录存parent_id Path Enumerations&#xff1a;每一条记录存整个tree path经过的node枚举&#xff08…

Java互斥锁简单实例

Java互斥锁简单实例 本文实例讲述了java互斥锁。分享给大家供大家参考。具体分析如下&#xff1a; 互斥锁&#xff0c;常常用于多个线程访问独占式资源&#xff0c;比如多个线程同时写一个文件&#xff0c;虽然互斥访问方式不够高效&#xff0c;但是对于一些应用场景却很有意义…

STM32 LoRa(学习二)

LoRa关键参数说明 LoRa数据包由三个部分组成&#xff1a;前导码、可选报头、数据有效负载。 前导码&#xff1a;用于保持接收机与输入的数据流同步。默认情况下&#xff0c;数据包含有12个符号长度的前导码。前导码是一个可以通过编程来设置的变量&#xff0c;所以前导码的长度…

我总结的接地概念,为什么水泥大地是导体,为什么要接地,TT和TN供电系统等

我总结的接地概念&#xff0c;为什么水泥大地是导体&#xff0c;为什么要接地&#xff0c;TT和TN供电系统等 wxleasyland 个人参考网上资料理解的相关接地的问题&#xff0c;可能会有不对的地方&#xff0c;仅供参考。 主要参考了大神的&#xff1a;《浅谈接地》https://zhuan…

软件测试员怎么提升自己的职业竞争力?

目录 管理方向 技术方向 初级测试人员 中级测试人员 高级测试人员 首先分析下软件测试岗位的发展方向&#xff1a;软件测试岗位可以向两个方向发展&#xff0c;一个管理方向&#xff0c;一个技术方向。现在很多做测试的人感到很迷茫&#xff0c;自己整天做着重复的事情&am…

关于远程直接内存访问技术 RDMA 的高性能架构设计介绍 | 龙蜥技术

编者按&#xff1a;传统以太网方案存在系统调用消耗大量时间、增加数据传输延时、对 CPU 造成很重的负担三个缺点&#xff0c;而 RDMA 技术可以解决以上三个缺点。那 RDMA 究竟是什么&#xff1f;它的方案的设计思路是什么&#xff1f;今天&#xff0c;浪潮信息驱动工程师刘伟带…

从零开始学python(十三)爬虫工程师自动化和抓包

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析&#xff0c;爬虫数…

三十三章 uboot使用(universal boot loader)

Linux 系统要启动就必须需要一个 bootloader 程序&#xff0c;也就说芯片上电以后先运行一段bootloader 程序。这段bootloader程序会先初始化DDR等外设&#xff0c;然后将Linux内核从flash(NAND&#xff0c;NORFLASH&#xff0c;SD&#xff0c; MMC 等)拷贝到 DDR 中&#xff0…

Mybatis-plus的批量插入真的不能用吗?

目录 &#x1f9e8;一、前言 &#x1f9e8;二、走进源码 1.进入 saveBatch 看下 2.往里ServiceImpl#saveBatch走 3.SqlHelper#executeBatch(Class, Log, Collection, int, BiConsumer),e> 4.SqlHelper#executeBatch(Class entityClass, Log log, Consumer consumer) …

Kata Containers

Kata Containers&#xff08;简称 Kata 或 Kata Containers&#xff09;是一个开源的容器运行时项目&#xff0c;它提供了一种轻量级的虚拟化解决方案&#xff0c;用于在容器内运行应用程序。Kata Containers 结合了虚拟机&#xff08;VM&#xff09;和容器的优势&#xff0c;旨…

无涯教程-jQuery - innerHeight( )方法函数

innerHeight()方法获取第一个匹配元素的内部高度(不包括边框&#xff0c;包括填充)。 innerHeight( ) - 语法 selector.innerHeight( ) innerHeight( ) - 示例 以下是一个简单的示例&#xff0c;简单说明了此方法的用法- <html><head><title>The jQuery…

银河麒麟桌面操作系统V10 (SP1) ARM64 aarch64 radeontop查看amd gpu使用率

安装radeontop yeqiangyeqiang-greatwall:~$ sudo apt install radeontop 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包是自动安装的并且现在不需要了&#xff1a;gconf-service gconf-service-backend gconf2-…

2.nio入门和netty

1.nio实现网络编程 //服务端 public class NIOServer {public static void main(String[] args) throws Exception{//创建ServerSocketChannel -> ServerSocketServerSocketChannel serverSocketChannel ServerSocketChannel.open();//绑定一个端口6666, 在服务器端监听se…

vue 使用vue-json-viewer 展示 JSON 格式的数据

npm install vue-json-viewer --save<el-button type"primary" click"previewClick">预览</el-button><el-dialog title"预览" :visible.sync"previewVisible" width"70%"><viewer ref"viewer&qu…

回顾.NET系列:Framework、Net Core、Net 过往

一、个人最近工作变化 我经历了可能很多技术人都会经历的过程&#xff0c;从一名纯粹的技术人员转型成为了一名技术管理我已经不再单纯了&#xff0c;经历了从做好自己的事&#xff0c;搞定一个复杂模块和系统&#xff0c;到带领一个小团队&#xff0c;攻克一个个复杂项目&…

迷你系统天花板 英特尔蝰蛇峡谷NUC12 评测

1.全新设计的NUC12 蝰蛇峡谷&#xff08;Serpent Canyon&#xff09; i7 12700HArc A770M 16GB版本开箱 近年来&#xff0c;ITX主机和小型化系统变得越来越受欢迎。英特尔的NUC受到许多玩家们的关注。作为mini主机的代表NUC小巧设计和灵活性使它成为很多玩家和科技爱好者的选择…