Java教程!每日蓝桥(25)
Posted 普通网友
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java教程!每日蓝桥(25)相关的知识,希望对你有一定的参考价值。
2 2 2
3 3 3
输出样例:
27
资源约定: .
峰值内存消耗(含虚拟机) < 256M
CPU消耗< 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“ 请您输…”的多余内容.
所有代码放在同-一个源文件中,调试通过后,拷贝提交该源码.
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是: Main, 否则按无效代码处理.
===========================================================================
本题在求解上主要还是要理解题意,对于这样一个在三个数组中找结果的提醒,很多同学想到的第一个思路应该就是遍历三个数组进行求解,在理论上这种方法是可行的,但是只是对于少量的数据,对于题中所给的数据,10^5遍历三次也就是10的15次方,这个数据是十分庞大的,所以对于该题来说是行不通的,那么我们其实可以想办法对这种方法进行优化,尽可能的减少遍历的次数。
其实对于这个题的其他解法是:用数组A[i]中对应的数后面找到一个对应B数组的一段数据,再用B[i]找出C数组中符合要求的数据。用下图来表示:
另一种解法,以B数组中的元素为参考,找出A数组中小于B数组的元素数量p,再找出C数组中大于B数组的元素数量q,则对于B[i]符合要求的数据数就是p*q个:但是这种方法在运算时,每对ans答案增加一次时,都要乘以1L,原因是因为数据在很大的时候是需要变成long型的,关于1L的解释入下:
java中经常会碰到“long c = 1L”的写法,L表示long ,long占用8个字节,表示范围:-9223372036854775808 ~ 9223372036854775807
1L其实就是1。
常量后面跟这个一般是指类型,1L表示1是长整型,如果是1f 表示是float型
关于这一种解法如下图:
但是该解法最后对于超大量数据是不符合要求的,尝试了很多次还是不行,不知道是为什么,但是思路结构和第二种方法差不多,但是第二种方法就是正确答案,有些疑惑,知道为什么的小伙伴可以留言一起解答,下面把这两种解法的代码都奉上:
============================================================================
第一种解法(大量数据时运算有误)
package 一八年省赛真题;
import java.sql.Array;
import java.util.Arrays;
import java.util.Scanner;
public class Year2018_Bt6
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int [] A = new int[N];
int [] B = new int[N];
int [] C = new int[N];
for (int i = 0; i < N; i++)
A[i] = scanner.nextInt();
for (int i = 0; i < N; i++)
B[i] = scanner.nextInt();
for (int i = 0; i < N; i++)
C[i] = scanner.nextInt();
//对输入的三个数组进行升序排列
Arrays.sort(A);
Arrays.sort(B);
Arrays.sort(C);
long ans = 0;
int p = 0,q = 0; //定义一个p,q来分别表示在数组B,C中从哪一位开始的数是大于前一个数组对应数的
for (int i = 0; i < N; i++)
//找出第一个大于A[i]的数
while(p<N && A[i]>=B[p]) p++;
int cq = 0;
//将B数组中剩下的数进行遍历
for (int j = p; j < N; j++)
//找出第一个大于B[j]的数
while(q<N && B[j]>=C[q]) q++;
//记录下每一次的起始数,为了减少下次遍历
if(j == p) cq=q;
ans += (N-q);
q=cq;
System.out.println(ans);
第二种解法(完全正确)
package 一八年省赛真题;
import java.util.Arrays;
import java.util.Scanner;
public class Year2018_Bt6_2
public static void main(String[] args)
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int [] A = new int[N];
int [] B = new int[N];
int [] C = new int[N];
for (int i = 0; i < N; i++)
A[i] = scanner.nextInt();
读者福利
读到这的朋友还可以免费领取一份收集的Java进阶知识笔记和视频资料。
更多笔记分享
读者福利*
读到这的朋友还可以免费领取一份收集的Java进阶知识笔记和视频资料。
[外链图片转存中…(img-TWrCGzk6-1628072226188)]
更多笔记分享
[外链图片转存中…(img-Y8IZ0qVn-1628072226191)]
[外链图片转存中…(img-1t60L9z0-1628072226192)]
以上是关于Java教程!每日蓝桥(25)的主要内容,如果未能解决你的问题,请参考以下文章