2018年第九届蓝桥杯省赛-递增三元组

164 阅读1分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

第六题:递增三元组

题目描述

给定三个整数数组 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,否则按无效代码处理。

代码1

暴力求解

package day_07;

import java.util.Scanner;

public class 递增三元组 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		
		int[] arr[]=new int[3][n];
		for(int i=0;i<3;i++) {
			for(int j=0;j<n;j++) {
				arr[i][j]=sc.nextInt();
			}
		}
		
		int count=0;
		
		for(int i=0;i<n;i++) {
			for (int j = 0; j < n; j++) {
				for(int k=0;k<n;k++) {
					if(arr[0][i]<arr[1][j]&&arr[1][j]<arr[2][k]) {
						count++;
					}
				}
				
			}
		}
		
		System.out.println(count);
		
	}

}

代码1的优化

优化前:

image.png

优化后:

image.png

优化处:

		for(int i=0;i<n;i++) {
			for (int j = 0; j < n; j++) {
				//如果数组b[j]的值小于a[i]就不在循环c[k]
				if(arr[0][i]<arr[1][j]) {
					for(int k=0;k<n;k++) {
						if(arr[1][j]<arr[2][k]) {
							count++;
						}
					}
				}	
			}
		}

代码2

我们可以从中间的数开始记录,将b大于的a数值记录下来,将b小于c的个数记下来。

package day_07;

import java.util.Scanner;

public class 递增三元组 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		
		int[] arr[]=new int[3][n];
		for(int i=0;i<3;i++) {
			for(int j=0;j<n;j++) {
				arr[i][j]=sc.nextInt();
			}
		}
		
		long startTime=System.currentTimeMillis();
		
		int count=0;
		
		int[] num=new int[2];
		
		for(int j=0;j<n;j++) {                          
			num[0]=0;
			num[1]=0;
			for(int i=0;i<n;i++) {
				if(arr[1][j]>arr[0][i]) {
					num[0]++;
				}
			}
			for(int k=0;k<n;k++) {
				if(arr[1][j]<arr[2][k]) {
					num[1]++;
				}
			}
			count=count+num[0]*num[1];
		}
		
		
		long endTime=System.currentTimeMillis();
		System.out.println("程序运行时间为:"+(endTime-startTime));
		System.out.println(count);
		
	}

}

image.png