1221. 四平方和--(暴力,二分)

题目:

1221. 四平方和 - AcWing题库

 思路1:暴力

暴力枚举
1.枚举顺序为从a到c,依次增大。
2.t=n-a*a-b*b-c*c,求得d=sqrt(t)
3.判断求出的d是否成立。d要求:d*d==t&&d>=c

#include<iostream>
#include<cmath>
using namespace std;
const int N=2300;
int n,a,b,c,d;
int main()
{
    cin>>n;
    for(a=0;a*a<n;a++)
        for(b=a;a*a+b*b<n;b++)
            for(c=b;a*a+b*b+c*c<n;c++){
                int t=n-a*a-b*b-c*c;
                d=sqrt(t);
                if(d*d==t&&d>=c){
                    cout<<a<<" "<<b<<" "<<c<<" "<<d;
                    return 0;
                }
                
            }
}

思路2:二分

1.以空间换取时间的思路。先枚举c,d的情况,将所以可能存入结构体Sum中。再枚举a,b的情况。我们若对Sum.s进行从小打到的排序,就可以用二分寻找满足条件的Sum。

2.在枚举a,b的过程中寻找Sum,此时已经可以确定a,b满足字典序,为保证c,d也为字典序,我们需要对结构体进行自定义排序,不仅仅要按照Sum.s从小到大的顺序排序,同时还要兼顾Sum.c和Sum.d。因此,这里我们需要用到自定义排序或者减号运算符重载。

 自定义排序:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 9 * 1e6;
int a, b, c, d, n, m;
struct Sum
{
    int s;
    int c;
    int d;
}sum[N];

bool comp(struct Sum sum1,struct Sum sum2)//自定义输出
{
    if (sum1.s != sum2.s)return sum1.s < sum2.s;
    else if (sum1.c != sum2.c)return sum1.c < sum2.c;
    else return sum1.d < sum2.d;
}

int main()
{
    cin >> n;
    //先枚举c,d,将平方和以及c,d存入结构体Sum(以空间换取时间)O(n3)->O(n2)
    for (c = 0; c * c < n; c++)
        for (d = c; c * c + d * d <= n; d++) {//存入结构体
            sum[m].s = c * c + d * d;
            sum[m].c = c;
            sum[m].d = d;
            m++;
        }
    sort(sum, sum + m, comp);//自定义输出(先后按照结构体内s,c,d从小到大顺序排序)

    //枚举a、b,同时二分查找符合条件的c、d
    for(a=0;a*a<n;a++)
        for (b = a; a * a + b * b < n; b++) {
            int L = 0, R = m-1;//对下标二分
            int t = n - a * a - b * b;
            while (L < R) {
                int mid = L + R >> 1;
                if (sum[mid].s >= t)R = mid;
                else L = mid + 1;
            }
            if (sum[L].s == t) {
                cout << a << " " << b << " " << sum[L].c << " " << sum[L].d;
                return 0;
            }
        }
}
减号运算符重载:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 9 * 1e6;
int a, b, c, d, n, m;
struct Sum
{
    int s;
    int c;
    int d;
    bool operator<(const Sum& t)const//重载减号运算符,实现自定义排序
    {
        //不同情况下减号赋予不同含义,返回值也不一样
        if (s != t.s)return s < t.s;
        else if (c != t.c)return c < t.c;
        else return d < t.d;
    }
}sum[N];


int main()
{
    cin >> n;
    //先枚举c,d,将平方和以及c,d存入结构体Sum(以空间换取时间)O(n3)->O(n2)
    for (c = 0; c * c <= n; c++)
        for (d = c; c * c + d * d <= n; d++) //存入结构体
            sum[m++] = { c * c + d * d,c,d };//结构体与类不同,无需构造函数

    sort(sum, sum + m);//自定义输出(先后按照结构体内s,c,d从小到大顺序排序)

    //枚举a、b,同时二分查找符合条件的c、d
    for (a = 0; a * a < n; a++)
        for (b = a; a * a + b * b < n; b++) {
            int L = 0, R = m - 1;//对下标二分
            int t = n - a * a - b * b;
            while (L < R) {
                int mid = L + R >> 1;
                if (sum[mid].s >= t)R = mid;
                else L = mid + 1;
            }
            if (sum[L].s == t) {
                cout << a << " " << b << " " << sum[L].c << " " << sum[L].d;
                return 0;
            }
        }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库(四)

文章目录 MySQL数据库一、外键外键前戏外键关系外键字段的建立建立外键时注意事项 二、表关系多对多三、表关系一对一四、多表查询思路五、连表查询操作六、Navicat可视化软件 MySQL数据库 一、外键 外键前戏 我们建立一张员工表id name age dep_name dep_desc1.表不清晰(现在…

Kubernetes(K8S)快速搭建typecho个人博客

Kubernetes&#xff08;K8S&#xff09;快速搭建typecho个人博客 1、准备工作 K8S集群环境&#xff0c;搭建教程参考腾讯云Lighthouse组建跨地域Kubernetes集群 K8S集群面板&#xff0c;搭建教程参考Kubernetes集群管理面板的安装及使用 - 青阳のblog-一个计算机爱好者的个人…

FFmpeg编译安装(windows环境)以及在vs2022中调用

文章目录 下载源码环境准备下载msys换源下载依赖源码位置 开始编译编译x264编译ffmpeg 在VS2022写cpp调用ffmpeg 下载源码 直接在官网下载压缩包 这个应该是目前&#xff08;2023/10/24&#xff09;最新的一个版本。下载之后是这个样子&#xff1a; 我打算添加外部依赖x264&a…

为啥外行都觉得程序员的代码不值钱?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

【Java 进阶篇】Java Servlet 执行原理详解

Java Servlet 是用于构建动态Web应用程序的关键组件之一。它允许开发者编写Java类来处理HTTP请求和生成HTTP响应&#xff0c;从而实现灵活、交互性强的Web应用。本篇博客将深入探讨Java Servlet的执行原理&#xff0c;适用于初学者&#xff0c;无需太多的先验知识。 什么是 Ja…

10.Z-Stack协议栈移植

一、下载Z-Stack协议栈源文件 安装过程全部默认下一步即可&#xff0c;安装完成后会在C盘根目录下生成一个【Texas Instruments】文件夹 二、删除一些不必要的文件 将【ZStack-CC2530-2.3.0-1.4.0】文件夹&#xff0c;复制到自己放置ZigBee工程的文件夹下进入到【ZStack-CC253…

【SA8295P 源码分析】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导

【SA8295P 源码分析】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导 系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》 本文链接:《【SA8295P 源码分析】111 - 使用 Infineon 工具升级DHU 的MCU 固件过程指导》 打开 Infineon 工具 默认是没有工程的,需…

Linux音频-基本概念

文章目录 机器声音的采集原理机器声音的播放原理音频相关基本概念计算机采集音频的模型Linux系统音频框架Linux音频框架的三类角色 Linux音频框架参考文章&#xff1a;Linux音频框架 机器声音的采集原理 声音是一种连续的信号&#xff0c;故其是一种模拟量。 录音设备可以捕获…

gRPC之gateway集成swagger

1、gateway集成swagger 1、为了简化实战过程&#xff0c;gRPC-Gateway暴露的服务并未使用https&#xff0c;而是http&#xff0c;但是swagger-ui提供的调用服 务却是https的&#xff0c;因此要在proto文件中指定swagger以http调用服务&#xff0c;指定的时候会用到文件 prot…

蓝桥杯 Java k倍区间

前缀和的一个神奇算法&#xff0c;这道题暴力是遍历前缀和的差&#xff0c;也就是遍历所有区间和看他是不是能不能正好除尽k 这道题的技巧是将所有前缀和和k求余 按照求余的结果放在一个数组中 那么余数为0的前缀和a一定满足要求&#xff08;[0,a]&#xff09; 余数相同的两两…

搭建SNMP服务器

要搭建SNMP服务器&#xff0c;您可以按照以下步骤进行操作&#xff1a; 选择合适的操作系统&#xff1a;您可以选择在Windows、Linux或其他操作系统上搭建SNMP服务器。不同的操作系统有不同的安装和配置方法。 安装SNMP软件&#xff1a;根据您选择的操作系统&#xff0c;安装相…

vue3 code format bug

vue code format bug vue客户端代码格式化缺陷&#xff0c;为了方便阅读和维护&#xff0c;对代码格式化发现这个缺陷 vue.global.min.3.2.26.js var Vuefunction(r){"use strict";function e(e,t){const nObject.create(null);var re.split(",");for(le…

QCC 音频输入输出

QCC 音频输入输出 QCC蓝牙芯片&#xff08;QCC3040 QCC3083 QCC3084 QCC5181 等等&#xff09;支持DAC、I2S、SPDIF输出&#xff0c;AUX、I2S、SPDIF、A2DP 输入 蓝牙音频输入&#xff0c;模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 输入方式切换参考 sta…

有哪些适用于 Windows 的PDF 阅读器?免费 PDF 阅读器清单

探索适用于 Windows 10 和 11 的最佳 PDF 阅读器 适用于 Windows 10 和 Windows 11 的最佳 PDF 阅读器让您可以在台式计算机上查看和共享文档。 最好的PDF 编辑器和免费的 PDF 编辑器配备了先进的工具&#xff0c;可以跨不同的操作系统工作。但是&#xff0c;当您只需要查看和…

《从零开始大模型开发与微调 :基于PyTorch与ChatGLM》简介

内 容 简 介 大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架&#xff0c;以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术&#xff0c;…

启动1000万个虚拟线程需要多少时间?需要多少平台线程?

之前&#xff0c;在Java新特性专栏中&#xff0c;我们简单介绍了Java 21正式发布的虚拟线程。 昨天&#xff0c;正好看到一个讲解此内容的视频&#xff0c;非常不错&#xff0c;所以DD这里给大家翻译好了&#xff0c;感兴趣的可以看看。可以进一步了解虚拟线程。 什么是虚拟线…

什么是Docker CLI

Docker CLI&#xff08;命令行界面&#xff09;是一个工具&#xff0c;允许用户通过命令行或终端与Docker进行交互。Docker是一个开源平台&#xff0c;用于开发、运送和运行应用程序。Docker使用容器化技术来打包应用程序及其依赖项&#xff0c;以确保在不同环境中的一致性和隔…

配置Sentinel 控制台

1.遇到的问题 服务网关 | RuoYi 最近调试若依的微服务版本需要用到Sentinel这个组件&#xff0c;若依内部继承了这个组件连上即用。 Sentinel是阿里巴巴开源的限流器熔断器&#xff0c;并且带有可视化操作界面。 在日常开发中&#xff0c;限流功能时常被使用&#xff0c;用…

Python UI自动化 —— pytest常用运行参数解析、pytest执行顺序解析

pytest常用Console参数&#xff1a; -v 用于显示每个测试函数的执行结果-q 只显示整体测试结果-s 用于显示测试函数中print()函数输出-x 在第一个错误或失败的测试中立即退出-m 只运行带有装饰器配置的测试用例-k 通过表达式运行指定的测试用例-h 帮助 首先来看什么参数都没加…

微信小程序实现文章内容详情

方案一、使用微信小程序官方提供的webview 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 方案二、把网页转成pdf直接展示 前提已经在微信公众平台开发管理配置好了安全域名即&#xff1a; 实现思路是发起网络请求拿到pdf下载地址&#xff0c;然后wx.download…