【无标题】

这是一个关于计算满足Ai<Bj<Ck条件的三元组(i,j,k)数量的问题。给定三个整数数组A,B,C,程序首先对数组进行排序,然后通过双指针方法统计满足条件的组合。在样例输入中,当数组均为111,222,333时,输出结果为27。
摘要由CSDN通过智能技术生成

标题:递增三元组

给定三个整数数组

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

代码

#include <stdio.h>
int a[100000],b[100000],c[100000];
//排序
void  sort(int a[],int n) {
	for (int i = 0;i < n-1;i++) {
		for (int j = 0;j < n-1-i; j++) {
			if (a[j] > a[j+1]) {
				int t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
}
int main () {
	int n;
	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,n);
	sort(b,n);
	sort(c,n);
	for (int i = 0;i < n;i++) {
		printf ("%d ",a[i]);
	} 
	int totality = 0;					//记录总数 
	int cnt1 = 0,cnt2 = 0;              //记录b,c组最小位次 
	//统计总数 
	for (int i = 0;i < n;i++) {
		int flag = 0;					
		for (int j = cnt1;j < n;j++) {
			if (b[j] > a[i]) {
				cnt1 = j;
				flag = 1;
				break;
			}
		}
		if (flag) {
		for (int j = cnt1;j < n;j++) {
			for (int k = cnt2;k < n;k++) {
				if (c[k] > b[j]) {
					cnt2 = k;
					totality += n - k;
					break;
				}
			}
		}
		}
		cnt2 = 0;
	}
	printf ("%d",totality);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值