Openjudge NOI题库 ch0111/t1794 集合加法
- 没有做优化,这题用不到二分
- 总时间限制:
- 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 <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 }