POJ 算法基础 编程题#1:集合加法

编程题#1:集合加法

来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 3000ms 内存限制: 65536kB

 

描述

给出2个正整数集合A = {pi | 1 <= i <= a},B = {qj | 1 <= j <= b}和一个正整数s。问题是:使得pi + qj = s的不同的(i, j)对有多少个。

 

输入

第1行是测试数据的组数n,后面跟着n组测试数据。

每组测试数据占5行,第1行是和s (1 <= s <= 10000),第2行是一个正整数a (1 <= a <= 10000),表示A中元素的数目。第3行是a个正整数,每个正整数不超过10000,表示A中的元素。第4行是一个正整数b (1 <= b <= 10000),表示B中元素的数目。第5行是b个正整数,每个正整数不超过10000,表示B中的元素。

注意:这里的集合和数学书上定义的集合有一点点区别——集合内可能包含相等的正整数。

 

输出

n行,每行输出对应一个输入。输出应是一个非负整数。

 

样例输入

 

2
99
2
49 49
2
50 50
11
9
1 2 3 4 5 6 7 8 9
10
10 9 8 7 6 5 4 3 2 1

 

样例输出

4
9

 1 #include<iostream>
 2 using namespace std;
 3 int sum, numA, numB;
 4 int arrayA[10001], arrayB[10001];
 5 
 6 int countHelper(int sum, int arrayA[], int numA, int arrayB[], int numB)
 7 {
 8     int count = 0;
 9     for (int i = 0; i < numA; ++i) {
10         for (int j = 0; j < numB; ++j) {
11             if (arrayA[i] + arrayB[j] == sum) {
12                 count++;
13             }
14         }
15     }
16     return count;
17 }
18 
19 int main()
20 {
21     int num;
22     cin>>num;
23     while(num--)
24     {
25         cin>> sum >> numA;
26         for (int i = 0; i < numA; ++i) {
27             cin>>arrayA[i];
28         }
29         cin>>numB;
30         for (int j = 0; j < numB; ++j) {
31             cin>>arrayB[j];
32         }
33         int count = countHelper(sum, arrayA, numA, arrayB, numB);
34         cout<<count<<endl;
35     }
36 
37     return 0;
38 }

 

posted @ 2015-09-30 16:22  dagon  阅读(1052)  评论(0编辑  收藏  举报