Openjudge NOI题库 ch0111/t1794 集合加法

没有做优化, 这题用不到二分
总时间限制:
3000ms
内存限制:
65536kB
描述
给出2个正整数集合A = {p i | 1 <= i <= a},B = {q j | 1 <= j <= b}和一个正整数s。问题是:使得p i + q j = 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 <stdio.h>
 2 int sum;
 3 int s(int x[],int y[])
 4 {
 5     int i,t,ans=0;
 6     for(i=1;i<=10000;i++)
 7     {
 8     //    printf("%d\n",i);
 9         if(x[i]==0) continue;
10         else if(sum-i>0)
11         {
12             t=sum-i;
13             ans+=x[i]*y[t];
14         }
15     }
16     return ans;
17 }
18 int main()
19 {
20     int n,k,ans;
21     int a[10002],b[10002];
22     int i,j;
23     scanf("%d",&n);
24     while(n--)
25     {
26         ans=0;
27         scanf("%d",&sum);
28         scanf("%d",&a[0]);//a[0]=lena
29         for(i=1;i<=a[0];i++)
30             a[i]=0;
31         for(i=1;i<=a[0];i++)
32         {
33             scanf("%d",&k);
34             a[k]++;
35         }
36         scanf("%d",&b[0]);//b[0]=lenb
37         for(i=1;i<=b[0];i++)
38             b[i]=0;
39         for(i=1;i<=b[0];i++)
40         {
41             scanf("%d",&k);
42             b[k]++;
43         }
44         //input finished
45         //if(a[0]<=b[0])
46         ans=s(a,b);
47         //else ans=s(b,a);
48         printf("%d\n",ans);
49     }
50     return 0;
51 }

 

你可能感兴趣的:(Openjudge NOI题库 ch0111/t1794 集合加法)