hrbust 1710 a + b = c 【双指针】

a + b = c
Time Limit: 2000 MS Memory Limit: 65536 K
Total Submit: 350(124 users) Total Accepted: 121(95 users) Rating: Special Judge: No
Description

A B C 三个集合的,其中aA, 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;
}

你可能感兴趣的:(双指针)