a + b = c | ||||||
|
||||||
Description | ||||||
有A、 B、 C 三个集合的,其中a∈A, b∈ B, c∈ C,求有多少种方式使得a + b = c。 |
||||||
Input | ||||||
有多组测试数据,请处理到文件结束。 对于每组测试数据,有三行: 第一行为A集合的描述,第一个数为n,表示A集合有n个数,接下来有n个整数a1~an。 第二行为B集合,第三行为C集合,表示含义参考第一行。 每个集合中的数两两不相等。 1<=n<=5000,|ai| <= 1 000 000 000 |
||||||
Output | ||||||
对于每组测试数据,输出一行,包含一个整数,表示有多少种组合方式。 |
||||||
Sample Input | ||||||
3 -10 4 -6 3 -10 3 -1 3 3 -4 -6 3 -8 -9 -4 3 9 -10 2 3 -8 -7 5 3 -4 -6 -2 3 9 -9 -2 3 3 -13 -4 |
||||||
Sample Output | ||||||
2 2 3 |
#include
using namespace std;
int a[5005];
int b[5005];
int c[5050];
int main()
{
int A, B, C;
while(cin >> A)
{
for(int i = 0; i < A; i++)
cin >> a[i];
cin >> B;
for(int i = 0; i < B; i++)
cin >> b[i];
cin >> C;
for(int i = 0; i < C; i++)
cin >> c[i];
sort(a, a + A);
sort(b, b + B);
int ans = 0;
for(int k = 0; k < A; k++)
{
for(int i = 0, j = B - 1; i < A && j >= 0; )
{
if(a[i] + b[j] == c[k])
{
ans++;
i++;
j--;
}
if(a[i] + b[j] < c[k])
i++;
if(a[i] + b[j] > c[k])
j--;
}
}
cout << ans << endl;
}
return 0;
}