IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 1221. 四平方和 Java题解 (暴力,哈希,二分)【第七届蓝桥杯省赛C++A/B组第七届蓝桥杯省赛JAVAB/C组】 -> 正文阅读

[C++知识库]1221. 四平方和 Java题解 (暴力,哈希,二分)【第七届蓝桥杯省赛C++A/B组第七届蓝桥杯省赛JAVAB/C组】

目录

解题思路:

Java代码: (暴力)

Java代码: (哈希)

Java代码: (二分)


?

输入样例:

5

输出样例:

0 0 1 2

解题思路:

  • 暴力:三层for直接遍历,通过判断第四个数是否存在来找合适解。时间复杂度为 O(n)=n^3.
  • 哈希:对前两个数遍历两层for,第三个数和第四个数的乘积保存到哈希表中,在两层for遍历时,通过检验cd乘积是否存在来找合适解。理论上时间复杂度为 O(n)=n^2.
  • 二分:同样对前两个数两层for遍历,对剩下的两个数的乘积以及对应的c和d直接以对象的形式存入list中,再将list中的对象有序排列,当两层for遍历时,在list中通过二分查找第一次出现的cd乘积。时间复杂度为 O(n)=n^2·logn.

Java代码: (暴力)

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();
		
		for(int a = 0; a * a <= n; a++) {
			for(int b = a; b *b + a *a <= n; b++) {
				for(int c = b; c * c + b * b + a * a <= n; c++) {
					int d = n - a * a - b * b - c * c;
					int t = (int)Math.sqrt(d);
					if(t * t == d) {//检验t是否是整数
						System.out.printf("%d %d %d %d", a, b, c, t);
						System.exit(0);
					}
				}
			}
		}
	}
}

Java代码: (哈希)

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();
		
		Map<Integer, Pair1221> map = new HashMap<>();//哈希打表
		for(int c = 0; c * c <= n; c++) {
			for(int d = c; c * c + d * d <= n; d++) {
				int cd = c * c + d * d;
				Pair1221 value = map.get(cd);
				if(value == null) {//只存储第一次的情况,保证字典序最小
					map.put(cd, new Pair1221(c, d));
				}
			}
		}
		
		for(int a = 0; a * a <= n; a++) {
			for(int b = a; b * b + a * a <= n; b++) {
				int cd = n - a * a - b * b;
				if(map.get(cd) != null) {
					System.out.printf("%d %d %d %d", a, b, map.get(cd).x, map.get(cd).y);
					System.exit(0);
				}
			}
		}
	}
}
class Pair1221{//存放cd成绩所相应的c和d
	int x;
	int y;
	
	public Pair1221(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

Java代码: (二分)

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();
		List<Mul> list = new ArrayList<>();//打表
		for(int c = 0; c * c <= n; c++) {
			for(int d = c; d * d + c * c <= n; d++) {
				list.add(new Mul(c * c + d * d, c, d));
			}
		}
		Collections.sort(list);
		
		for(int a = 0; a * a <= n; a++) {
			for(int b = a; b * b + a * a <= n; b++) {
				int cd = n - a * a - b * b;
				
				int l = 0; 
				int r = list.size() - 1;
				while(l < r) {//二分查找
					int mid = l + r >> 1;
					if(list.get(mid).mul >= cd) r = mid;//找“最左面”的cd ,x<=arr[mid]
					else l = mid + 1;
				}
				if(list.get(l).mul == cd) {
					System.out.printf("%d %d %d %d", a, b, list.get(l).c, list.get(l).d);
					System.exit(0);
				}
			}
		}
	}
}
class Mul implements Comparable<Mul>{
	int mul;
	int c;
	int d;

	public Mul(int mul, int c, int d) {
		this.mul = mul;
		this.c = c;
		this.d = d;
	}

	@Override
	public int compareTo(Mul o) {//在乘积有序的前提下将cd字典序化
		if(this.mul != o.mul) {
			return this.mul - o.mul;
		}else if(this.c != o.c) {
			return this.c - o.c;
		}else {
			return this.d - o.d;
		}
	}
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:20:07  更:2022-03-22 20:20:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:01:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码