poj2785 4 Values whose Sum is 0

本文介绍了一种解决四数组和为0问题的有效算法。通过对数组C和D的所有可能组合求和并排序,然后利用二分查找法找到与A和B组合相反数相等的和,从而高效地计算出所有和为0的组合数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接: poj2785 4 Values whose Sum is 0

题意:给出元素都为n的4个数组A,B,C,D,要从每个数组中各取一个数,求这四个数和为0的次数,一个数列有多个相同数字时,当作不同数字看待

//思路先枚举C,D的和排序,再枚举A,B的和在C,D和中进行折半查找C+D=-(A+B)的部分 
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 4000 + 5;
//输入 
int n;
int A[MAX_N], B[MAX_N], C[MAX_N], D[MAX_N];
int CD[MAX_N * MAX_N]; //存C、D中的所有和 
int main(){
	int n, i, j;
	scanf("%d", &n);
	for(i = 0;i < n;i ++)
		scanf("%d%d%d%d", &A[i], &B[i], &C[i], &D[i]); 
	for(i = 0;i < n;i ++){	//枚举C、D的和存入CD中 
		for(j = 0;j < n;j ++)
			CD[i * n + j] = C[i] + D[j];
	}
	sort(CD, CD + n * n);	//对和排序 
	long long res = 0;
	for(i = 0;i < n;i ++){
		for(j = 0;j < n;j ++){
			int cd = -(A[i] + B[j]);
			//取出C和D中和为cd的部分(CD中>cd的第一个位置与>=cd的第一个位置相减) 
			res += upper_bound(CD, CD + n * n, cd) - lower_bound(CD, CD + n * n, cd);
		}
	}
	printf("%lld\n", res);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值