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。
- 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
- 第二个可能称为该关键字的值(value);
用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