递增三元组(蓝桥杯18F)

暴力求解:

#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	int* A = new int[N];
	int* B = new int[N];
	int* C = new int[N];
	for (int i = 0; i < N;i++) {
		cin >> A[i];
	}
	for (int i = 0; i < N; i++) {
		cin >> B[i];
	}
	for (int i = 0; i < N; i++) {
		cin >> C[i];
	}
	int cnt = 0;
	for (int i = 0; i < N;i++) {
		for (int j = 0; j < N; j++) {
			for (int z = 0; z < N; z++) {
				if (A[i]<B[j]<C[z]) {
					cnt++;
				}
			}
		}
	}
	cout << cnt;
	return 0;
}

优化排序加二分查找:

#include<iostream>
using namespace std;
void Qsort(int arr[], int L, int R) {
	if (L >= R) {
		return;
	}
	int left = L, right = R, key = arr[L], flag = 0;
	while (left < right) {
		if (flag == 0) {
			if (arr[right] < key) {
				arr[left] = arr[right];
				left++;
				flag = 1;
			}
			else {
				right--;
			}
		}
		else if (flag == 1) {
			if (arr[left] > key) {
				arr[right] = arr[left];
				right--;
				flag = 0;
			}
			else {
				left++;
			}
		}
	}
	arr[left] = key;
	Qsort(arr, L, left - 1);
	Qsort(arr, left + 1, R);
}
int tSearch_min(int* arr,int left,int right,int key, int tag) {
	if (tag == 0 && left>right) {
		return left;
	}
	else if(tag == 1 && left>right) {
		return left;
	}
	int mid = (left + right) / 2;
	if (key < arr[mid]) {
		return tSearch_min(arr, left, mid - 1, key, 0);
	}
	else if (key>arr[mid]) {
		return tSearch_min(arr, mid + 1, right, key, 1);
	}
	else {
		int i;
		for (i = mid; i >= left;i--) {
			if (arr[i] < key ) {
				return (i + 1);
			}
		}
		return (i + 1);
	}
}
int tSearch_max(int* arr, int left, int right, int key, int tag) {
	if (tag == 0 && left > right) {
		return left;
	}
	else if (tag == 1 && left > right) {
		return left;
	}
	int mid = (left + right) / 2;
	if (key < arr[mid]) {
		return tSearch_max(arr, left, mid - 1, key, 0);
	}
	else if (key > arr[mid]) {
		return tSearch_max(arr, mid + 1, right, key, 1);
	}
	else {
		int i;
		for (i = mid; i <= right; i++) {
			if (arr[i] > key) {
				return i;
			}
		}
		return i;
	}
}
int main() {
	int N;
	cin >> N;
	int* A = new int[N];
	int* B = new int[N];
	int* C = new int[N];
	for (int i = 0; i < N; i++) {
		cin >> A[i];
	}
	for (int i = 0; i < N; i++) {
		cin >> B[i];
	}
	for (int i = 0; i < N; i++) {
		cin >> C[i];
	}
	Qsort(A, 0, N - 1);
	Qsort(B, 0, N - 1);
	Qsort(C, 0, N - 1);
	int cnt = 0;
	for (int i = 0; i < N;i++) {
		int key = B[i];
		int min = tSearch_min(A, 0, N - 1, key, 0);
		int max = N - tSearch_max(C, 0, N - 1, key, 0);
		cnt += (min*max);
	}
	cout << cnt;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值