51Nod_1001 数组中和等于K的数对
http://www.51nod.com/Challenge/Problem.html#!#problemId=1001
题目
给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。
输入
第1行:用空格隔开的2个数,K N,N为A数组的长度。(2 <= N <= 50000,-10^9 <= K <= 10^9);第2 - N + 1行:A数组的N个元素。(-10^9 <= A[i] <= 10^9)
输出
第1 - M行:每行2个数,要求较小的数在前面,并且这M个数对按照较小的数升序排列。如果不存在任何一组解则输出:No Solution。
样例输入
8 9
-1
6
5
3
4
2
9
0
8
样例输出
-1 9
0 8
2 6
3 5
分析
思路1,先对数组进行递增排序,对不大于K/2的元素a[i]使用二分查找查看是否存在K-a[i]。思路2,由于N个数各不相同,因此可使用STL的set(集合)进行解题
C++程序(思路1)
#include<iostream>
#include<algorithm>
using namespace std;
const int N=50000;
int a[N];
int main()
{
int k,n;
bool flag=false;
scanf("%d%d",&k,&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);//使用sort进行排序
for(int i=0;i<n;i++)
if(binary_search(a,a+n,k-a[i])){//使用库函数进行二分查找
if(a[i]*2>=k)//避免重复输出
break;
printf("%d %d\n",a[i],k-a[i]);
flag=true;
}
if(!flag)
printf("No Solution\n");
return 0;
}
C++程序(思路2)
#include<iostream>
#include<set>
using namespace std;
int main()
{
int k,n,x;
set<int>s;
bool flag=false;
scanf("%d%d",&k,&n);
for(int i=0;i<n;i++){
scanf("%d",&x);
s.insert(x);
}
for(set<int>::iterator it=s.begin();it!=s.end();it++)
if(s.count(k-*it)){//判读 k-这个元素 是否在集合中
if((*it)*2>=k)//避免重复输出
break;
printf("%d %d\n",*it,k-*it);
flag=true;
}
if(!flag)
printf("No Solution\n");
return 0;
}