第九届蓝桥杯java B组—第六题递增三元组(详细介绍)

1.大赛题目

给定三个整数数组
A = [A1, A2, … AN],
B = [B1, B2, … BN],
C = [C1, C2, … CN],
请你统计有多少个三元组(i, j, k) 满足:

1. 1 <= i, j, k <= N
2. Ai < Bj < Ck

【输入格式】
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。

对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000

【输出格式】
一个整数表示答案

【输入样例】
3
1 1 1
2 2 2
3 3 3

【输出样例】
27

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

2.代码实例1

public class Lanqiaoninthsix {
	static Scanner sc = new Scanner(System.in);
	// 输入第一行N
	static int N = sc.nextInt();
	static int sum = 0;
	// 定义三个数组A、B、C
	static int A[] = new int[N];
	static int B[] = new int[N];
	static int C[] = new int[N];
	
	public static void main(String[] args) {
		input();
		f();
		System.out.println(sum);
	}
	public static void input() {
		// for循环输入三个数组
		if(N>=1 && N<=100000) {			//对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000 
			for(int i=0;i<N;i++) {
				A[i] = sc.nextInt();
			}for(int i=0;i<N;i++) {
				B[i] = sc.nextInt();
			}for(int i=0;i<N;i++) {
				C[i] = sc.nextInt();
			}
		}
	}
	public static void f() {
		for(int i=0;i<N;i++) {
			for(int j=0;j<N;j++) {
				for(int k=0;k<N;k++) {
					if(A[i]<B[j] && B[j]<C[k] ) {	//Ai < Bj < Ck  
						sum++;
					}
				}
			}
		}
	}
}

3.运行结果

3
1 1 1
2 2 2
3 3 3
27

以上这种暴力的方法可能会超时,下面看另外一种相似的解法

4.代码实例2

public class test {
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		Integer 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();
		}
		//定义一个计数器,记录最终的结果数sum
		@SuppressWarnings("unused")
		//first是第二行数据中的第一个数比第一行数据中的数大的个数,two是第三行数据中的数比第一行数据中的第一个数大的个数,以此类推
		int sum = 0,first = 0,two = 0;
		//判断
		for(int i = 0;i<N;i++) {
			for(int j = 0;j<N;j++) {
				if(B[j]>A[i]) {
					first++;
				}
				System.out.println("first:"+first);
			}
			
			for(int k = 0;k<N;k++){
				if(C[k]>B[i]) {
					two++;
				
				}
				System.out.println("two:"+two);
			}
			sum += first*two;
			//每一轮循环之后都要将first、two重设为0
			first = 0;
			two = 0;
		}
		System.out.println(sum);
		//申请了资源要记得归还
		scanner.close();
	}
}

5.详细讲解

因为我们把第一行数据放到A数组里面了
把第二行数据放到B数组里面了
把第三行数据放到C数组里面了

所以

第一次最外层循环:

比较第二行数据中的第一个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第一个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第一次循环的值

第二次最外层循环:

比较第二行数据中的第二个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第二个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第二次循环的值

第三次最外层循环:

比较第二行数据中的第三个数2跟第一行数据中的所有的数比较
如果比其大的,则加1,所以第一次比较的结果为3。
同理,第三行数据中的所有的数跟第二行的第三个数进行比较,如果比其大
的,则加1,所以第二次比较的结果也为3。两个值相乘3*3=9;这是第三次循环的值

最终结果9+9+9=27,图解如下图所示:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,不妨过来讨论一下哦! 第1章 Java概述 1.1 Java的发展史 1.1.1 Java起源 1.1.2 Java发展 1.2 Java是什么 1.2.1 Java语言 1.2.2 Java平台 1.2.3 Java网络操作系统 1.3 Java的特点 1.4 Java程序类型 1.5 JDK与JRE 1.5.1 Java开发工具包 1.5.2 Java运行环境 1.6 Java技术体系 1.7 Java虚拟机 1.7.1 虚拟机数据类型 1.7.2 Java虚拟机的生命周期 1.7.3 Java虚拟机的体系结构 1.8 垃圾收集器 1.9 本章习 第2章 Java开发环境 2.1 J2SE的下载和安装 2.1.1 J2SE的下载 2.1.2 J2SE的安装 2.2 环境变量的配置与测试 2.2.1 设置环境变量path 2.2.2 设置环境变量classpath 2.2.3 环境变量的测试 2.3 API文档的下载与使用 2.4 第一个应用程序 2.4.1 HelloWorld程序 2.4.2 程序运行编译命令 2.4.3 HelloWorld编译与运行 2.5 简单开发工具介绍 2.5.1 EditPlus的编译与运行 2.5.2 在UltraEdit上开发Java 2.6 集成开发环境Eclipse介绍 2.6.1 Eclipse下载与安装 2.6.2 Eclipse的透视图 2.6.3 Eclipse的视图(View) 2.6.4 Eclipse的编辑器 2.6.5 Eclipse的工具栏和菜单栏 2.6.6 使用Eclipse编写HelloWorld程序 2.7 本章习 第3章 Java语言基础 3.1 标识符 3.1.1 标识符的概念 3.1.2 变量命名规则 3.1.3 变量命名技巧 3.2 关键字 3.3 注释 3.4 数据类型 3.4.1 整型 3.4.2 浮点型 3.4.3 字符型 3.4.4 布尔型 3.5 变量与常量 3.5.1 变量声明 3.5.2 变量赋值和初始化 3.5.3 常量 3.6 类型转化 3.6.1 数值类型之间的转换 3.6.2 强制类型转换 3.7 运算符 3.7.1 算术运算符 3.7.2 关系运算符 3.7.3 逻辑运算符 3.7.4 位运算符 3.7.5 自动递增和递减 3.7.6 三元运算符 3.7.7 运算符的优先级 3.8 本章习 第4章 程序流程控制 4.1 顺序结构 4.2 条件语句 4.2.1 if语句 4.2.2 if-else语句 4.2.3 if-else-if语句 4.2.4 if语句的嵌套 4.2.5 布尔表达式 4.2.6 开关语句 4.3 循环语句 4.3.1 while循环结构 4.3.2 do-while 循环结构 4.3.3 for循环结构 4.3.4 循环的嵌套 4.4 转向语句 4.4.1 break中断语句 4.4.2 continue条件继续语句 4.4.3 标签语句 4.5 返回语句 4.6 综合实例:水仙花数 4.7 本章习 第5章 字符串 5.1 字符串简介 5.1.1 字符串常量 5.1.2 String创建字符串常量 5.1.3 StringBuffer创建字符串 5.2 连接字符串 5.2.1 与字符串的连接 5.2.2 与其他数据类型的连接 5.3 String字符串操作 5.3.1 基本操作 5.3.2 比较 5.3.3 转化 5.3.4 查找 5.3.5 截取拆分 5.3.6 替换或修改 5.4 StringBuffer类操作 5.4.1 基本操作 5.4.2 字符串操作方法 5.4.3 添加append() 5.4.4 插入insert() 5.5 实例:字符串应用 5.6 本章习 第6章 数 6.1 一

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁同学与Android

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值