其他分享
首页 > 其他分享> > P1748 a+b+c+d==0

P1748 a+b+c+d==0

作者:互联网

求和问题可以被看做是以下的公式,给定 A,B,C,D 四个列表,计算有多少四元组满足 (a, b, c, d) ∈ A × B × C × D 且 a + b + c + d = 0。我们推测所有的列表都有 n 个数字。

注:不同的四元组是指元素位置不一样的四元组

数据范围 n<=2e3n<=2e3

样例输入

输入的第一个数字指明有 T 组。每一组这样描述,第一行是列表大小 n, 然后有 n 行。每一行都有四个整型数字,分别属于 A,B,C,D 四列。

样例输出

对于每一个测试用例,统计有多少个四元组满足他们的和是 0 。每一组数据一行。

Sample Input

Copy to Clipboard
1
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45 

Sample Output

Copy to Clipboard
5

这题我尝试了递归和回溯,都不好写.本题和八皇后最大的区别是没有一个条件进行约束,除了最后的结果外不能判断每一步对不对.
按照网上的思路写吧.
类似于a+b=0,只需要遍历所有的结果就可以了.本题有4个数组,那么就先两两相加,转化为二元问题.
但是数据太大,这里有两种思路:
1.使用STL的MAP

map是STL的一个关联容器,它提供一对一的hash

用map来存数据,就可以避免存重复的数据.简单很多.

2.正常遍历出所有结果,排序后使用二分查找来加快速度.但还需要考虑左右两边是不是相等,比较麻烦.

map的方法如下:

#include<iostream>
#include<map>
using namespace std;
int A[2001],B[2001],C[2001],D[2001];
int main()
{
    int T,n,sum=0,count=0;
    cin>>T;
    while(T--){
        cin>>n;
        sum=0;
        count=0;
        for(int i=1;i<=n;i++)
        cin>>A[i]>>B[i]>>C[i]>>D[i];
        map<int,int> result;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            sum=A[i]+B[j];
            ++result[sum];
        }
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            sum=C[i]+D[j];
            if(result[-sum]>0)
            count+=result[-sum];
        }
        cout<<count<<endl;
    }
    return 0;
}

另外,2e3是2000,不是8

标签:count,map,P1748,int,sum,四元组,2001
来源: https://www.cnblogs.com/ACM-YYDS/p/16342266.html