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)的主要内容,如果未能解决你的问题,请参考以下文章

备战蓝桥杯 算法·每日一题(详解+多解)-- day12

蓝桥Java每日一练————3.合并两个有序链表

每日LeetCode力扣(21~25)

每日蓝桥62一九年省赛Java组真题“组队”

算法·每日一题(详解+多解)-- day13

蓝桥Java每日一练————6.二叉树的前中后序遍历(递归与迭代)