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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 第十二届蓝桥杯javaB组刷题day2 -> 正文阅读

[数据结构与算法]第十二届蓝桥杯javaB组刷题day2

1.直线

?我们思路:

暴力解法,将所有可能的情况列举出来,故需要两个坐标的横纵坐标,便需要四个for循环来进行遍历,出现问题:

①需要排除斜率为0的情况,后面再单独进行相加

②因为需要set来加入斜率,而一条斜线y=kx+b,包括k和b,set只能包含key,所以我们需要定义一个直线类进行添加

★使用HashSet存储自定义对象需要重写equals方法和HashSet方法????????

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<Line> set = new HashSet<>();
        for (int i = 0; i < 20 ; i++) {
            for (int j = 0; j < 21; j++) {
                for (int k = 0; k < 20; k++) {
                    for (int l = 0; l < 21; l++) {
                        if(i != k){
                            double K = (j - l)/(i - k);
                            double B = -i * K + j;
                            set.add(new Line(B,K));
                        }
                    }
                }
            }
            }
        System.out.println(set.size() + 20);
    }
    static class Line {

        double k, b;

        Line(double b, double k) {
            this.k = k;
            this.b = b;
        }
        @Override
        public boolean equals(Object obj) {
            return k == ((Line)obj).k && b == ((Line)obj).b;
        }

        @Override
        public int hashCode() {
            return (int)k ^ (int)b;
        }
    }
}

上面答案存在精度问题,故答案有误

2.货物摆放

未想出解法zzzzz

想使用三个for循环进行遍历,x*y*z=答案时,使数量++,但数字太大了不可取

别人的解法:

根据题目要求,L 与 W 以及 H 相乘 必须等于 n。可以发现,如果一个数可以由三个数相乘得到,那么这三个数一定都是这个数的因数。举个例子:24,1 * 2 * 12 = 24,2 * 2 * 6 = 24 等等。

考虑到这里,解法就呼之欲出了,填空题可以直接暴力。先求出 n 的所有因数,这里注意必须是所有的因数,包括 n 本身,然后三层循环遍历搜索即可。?

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        
        List<Long> yz = new ArrayList<>();
        
        long n = 2021041820210418L;
        //因为是因子,故不可能大于n的开根号
        for (long i=1; i<=(int)Math.sqrt(n); i++) {
            //获取n的因子,加入集合当中
        	if (n % i == 0) {
        		yz.add(i);
        		yz.add(n/i);
        	}
        }
        
        int cnt = 0;
        //遍历所有的因子,若可以则让计数器++
        for (int i=0; i<yz.size(); i++) {
        	for (int j=0; j<yz.size(); j++) {
        		for (int k=0; k<yz.size(); k++) {
        			if (yz.get(i) * yz.get(j) * yz.get(k) == n) {
        				cnt++;
        			}
        		}
        	}
        }
        System.out.println(cnt);
        
        scan.close();
    }
}

3.?路径(未学)

4.时间显示

?需要时间api的应用(有待提高):

public class Main {
    public static void main(String[] args) {
        System.out.println(
                LocalTime.MIDNIGHT.
                        plusSeconds(
                                new Scanner(System.in).nextLong() / 1000).
                        format(DateTimeFormatter.ISO_LOCAL_TIME)
        );
    }
}

5.最少砝码

未实现zzzz

找规律题,需要自行演算从中寻找出一定的规律

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
		int weight = 1;
		int count = 1;
		int total = 1;
		while (total < n) {
			count++;
			weight *= 3;
			total += weight;
		}
		System.out.println(count);
	}
}

解析
结果应该是最少的砝码数量
首先,如果要称的重量为1的话,只能选择重量为1的砝码,1是必选的一个砝码。

然后再称比1重的,反正都是要再加砝码,那我们为何不选一个能称的重量尽可能大的呢。
选1、2的砝码可以满足1=1,2=2,1+2=3
选1、3的砝码可以满足1=1,2=3-1,3=3,4=3+1
选1、4的砝码可以满足1=1,2=?无法称2,不合题意
因此我们选择的砝码组合是1、3,此时我们可以称的最大重量为4

当我们还需要再增加砝码时
同理可得
选1、3、9的组合可以满足小于等于13(13=1+3+9)的所有重量

从中可以发现一个规律,当我们需要第三个砝码是,前两个砝码(1、3)满足的最大重量已经是4了,下一个要满足的重量是5,我们遵循砝码尽可能大的原则,选择的第三个砝码的重量满足的条件是:它减去 已经可以称得的最大重量 可以得到 下一个需要称的重量。也就是weight - 4 = 5,可得weight为9

再往下推,可以得到下面的表格

?到此已经找到规律,可以写出这道题的代码了
表格的三列分别对应了

count++;?? ??? ?//count=count+1
weight*=3;?? ??? ?//weight=weight*3
total+=weight;?? ?//total=total+weight

其中总重量是当前所有砝码之和,因此必须先乘3,后加到总重量里,除此之外,三行代码的顺序可调换

如果想证明的话,可以发现,取第三个砝码是weight - 4 = 5,要求的下一个重量5是总重量+1,即下一个砝码重量是当前总重量*2+1,nextWeight = total * 2+1,也可以表示为要求的下一个砝码重量weight=previousTotal * 2 + 1
证明第count次增加的砝码都是3的count-1次方

6.双向排序(不懂)

?7.括号序列(不懂)

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:49:54  更:2022-03-22 20:52:23 
 
开发: 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/26 11:34:10-

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