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