1. 程式人生 > >2018年第九屆藍橋杯C語言B組答案第六題:遞增三元組

2018年第九屆藍橋杯C語言B組答案第六題:遞增三元組

標題:遞增三元組
給定三個整數陣列
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

請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。

注意:

main函式需要返回0;

只使用ANSI C/ANSI C++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include <xxx>
不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

程式碼:

#include<iostream>

using namespace std;
int main()
{
int N,A[100],B[100],C[100],sum=0;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>A[i];
}
for(int j=0;j<N;j++)
{
cin>>B[j];
}
for(int k=0;k<N;k++)
{
cin>>C[k];
}
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])
{
sum++;
   }
}
}
}
cout<<sum<<endl;

我就是用這種笨方法算出來的(一看就菜~~)

下面是他們用的方法(確實棒!):

#include <iostream>  

#include <cstdio>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
const int MAXN = 100005;  
int a[MAXN],b[MAXN],c[MAXN];  
int n,sum;  
  
int main()  
{  
  scanf("%d",&n);  
  for(int i=0;i<n;i++)scanf("%d",&a[i]);  
  for(int i=0;i<n;i++)scanf("%d",&b[i]);  
  for(int i=0;i<n;i++)scanf("%d",&c[i]);  
  sort(a,a+n);  
  sort(b,b+n);  
  sort(c,c+n);  
  sum = 0;  
  for(int i=0;i<n;i++){  
    int x = (lower_bound(a,a+n,b[i]) - a);  
    int y = (n - (upper_bound(c,c+n,b[i]) - c));  
    sum += x*y;  
  }  
  printf("%d\n",sum);  
  return 0;  
}