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

news/2024/7/24 2:17:15 标签: 算法, c++

题目:

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;
            }
        }
}


http://www.niftyadmin.cn/n/5122896.html

相关文章

android button 按钮,设置左/右小图标,与文字居中距离

参考博客地址 功能点 支持自定义图标与文字的距离支持小图标宽高自定义支持左右自定义小图标 maven { url https://jitpack.io } implementation com.github.CMzhizhe:AppCompatButtonProject:1.0.0<com.gxx.buttonlibrary.DrawableCenterButtonandroid:layout_marginTop&…

VLAN实现二层流量隔离(mux-vlan)应用基础配置

MUX VLAN能够提供VLAN内的二层流量隔离机制。 MUX VLAN的类型如下所示 主VLAN: 加入主VLAN的接口可以和MUX VLAN内的所有接口进行通信 从VLAN: (1)隔离型从VLAN: 同一VLAN内接口之间不能互相通信&#xff0c;可以与主VLAN接口通信&#xff0c;不同从VLAN之间不能互相通信。 …

RCE 远程代码执行漏洞分析

RCE 漏洞 1.漏洞描述 Remote Command/Code Execute 远程命令执行/远程代码执行漏洞 这种漏洞通常出现在应用程序或操作系统中&#xff0c;攻击者可以通过利用漏洞注入恶意代码&#xff0c;并在受攻击的系统上执行任意命令。 2.漏洞场景 PHP 代码执行PHP 代码注入OS 命令执…

Ps:套索工具

Ps 的套索工具有三种&#xff0c;主要通过手动绘制的方式创建选区。 套索工具 Lasso Tool 又称“自由套索工具”&#xff0c;可绘制任意形状的选区&#xff0c;灵活快速但不够精确&#xff0c;是仅需粗略选区时&#xff08;比如&#xff0c;生成式填充等&#xff09;最常用的工…

【Python机器学习】零基础掌握IsolationForest集成学习

如何有效地识别异常数据点? 在日常工作和生活中,经常会遇到需要从大量数据中找出异常或者“不一样”的数据点的情况。比如在金融领域,怎样从数以百万计的交易记录中准确地找出可疑的欺诈交易?又或者在电商平台,如何从海量的商品评论中找出那些刷好评或刷差评的异常数据?…

造车先做三蹦子-之三:自制数据集(6x6数据集)230103

6*6的数据集制造、与识别: #6*6的数据集的制作、与识别、测试、输出等import torch import torch.nn as nn import torch.optim as optim# 定义模型 class NeuralNet(nn.Module):def __init__(self, input_size, hidden_size, num_classes):super(NeuralNet, self).__init__(…

深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南

深入理解Spring Boot AOP&#xff1a;CGLIB代理与JDK动态代理的完全指南 前言第一&#xff1a;AOP和代理模式AOP&#xff08;面向切面编程&#xff09;&#xff1a;代理模式&#xff1a; 第二&#xff1a;深入分析CGLIB代理&#xff0c;包括其实现原理和内部机制CGLIB的实现原理…

【跟小嘉学 Rust 编程】三十三、Rust的Web开发框架之一: Actix-Web的基础

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…