遞增三元組(藍橋杯)

給定三個整數數組
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

 

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