题目
问题描述:
考虑一组n个不同的正整数a1,a2,...,am,它们的值在1到1000000之间。给定一个整数x。写一个程序sumx计算这样的数对个数(ai,aj),1<=i<j<=n并且ai+aj=x。
数据输入:
标准输入的第一行是一个整数n(1<=n<=1000000)。第二行有n个整数表示元素。第三行是一个整数x(1<=x<=2000000)。
数据输出:
输出一行包含一个整数表示这样的数对个数。
注意:对于50%的测试数据,n<=1000。
输入输出样例:
sumx.in
9
5 12 7 10 9 1 2 3 11
13
sumx.out
3
解释:不同的和为13的数对是(12, 1), (10, 3)和(2, 11)。
分析
开个桶,或者排序二分
代码
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int b[1000010]; 5 int main() 6 { 7 freopen("sumx.in","r",stdin); 8 freopen("sumx.out","w",stdout); 9 int n,x,sum=0; 10 scanf("%d",&n); 11 for (int i=1;i<=n;i++) 12 { 13 int a; 14 scanf("%d",&a); 15 b[i]=a; 16 } 17 scanf("%d",&x); 18 sort(b+1,b+1+n); 19 for (int i=1;i<=n;i++) 20 { 21 int l=1,r=n,mid,c=0; 22 while (l<=r) 23 { 24 mid=(l+r)/2; 25 if (b[mid]+b[i]<=x) 26 { 27 l=mid+1; c=mid; 28 } 29 else r=mid-1; 30 } 31 if (b[c]+b[i]==x&&c!=i) 32 sum++; 33 } 34 printf("%d",sum/2); 35 }