递增三元组(蓝桥杯)

给定三个整数数组
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 

解析:题目中说三个数必须满足:Ai < Bj < Ck ,我的思路是用三个数组来存放三行数据, 然后将每一个数组排序,然后再比较数据。例如三个数组分别为a[i]、b[j]、c[k],用三个for循环比较,因为三个数组都是从小打到,所以在比较过程中如果a[i]>=b[j],或者是b[j]>=c[k]时就停止向下比较,因为往下比较数越来越大,这样就将时间复杂度大大缩短了。

代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class 递增三元组
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int[] a = new int[n];   //存第一行数据
		int[] b = new int[n];   //存第二行数据
		int[] c = new int[n];   //存第三行数据
		int cnt = 0;
		for(int i=0;i<n;++i)
		{
			a[i] = in.nextInt();
		}
		for(int i=0;i<n;++i)
		{
			b[i] = in.nextInt();
		}
		for(int i=0;i<n;++i)
		{
			c[i] = in.nextInt();
		}
		Arrays.sort(a);   //升序排序
		Arrays.sort(b);   //升序排序
		Arrays.sort(c);   //升序排序
		int x = 1;       //若值为0时,则不符合题目中的条件
		int y = 1;       //若值为0时,则不符合题目中的条件
		for(int i=0;i<n;++i)
		{
			if(x==0)     //若值为0时,再往下比较都不符合
			{
				break;
			}
			for(int j=0;j<n;++j)
			{
				if(a[i]>=b[j]||y==0)   //只要a[i]>=b[j],再往下比较都不符合
				{
					x = 0;
					break;
				}
				for(int k=0;k<n;++k)
				{
					if(b[j]>=c[k])  //只要b[j]>=c[k],再往下比较都不符合
					{
						y = 0;
						break;
					}
					cnt++;    //符合a[i]<b[j]<c[k]
				}
			}
		}
		System.out.println(cnt);  //符合个数
	}
}

运行结果:

输入:

3
1 1 1
2 2 2
3 3 3

输出:

27

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章