51Nod 1001 陣列中和等於K的數對 二分查詢
阿新 • • 發佈:2018-12-24
給出一個整數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
用二分查詢解決此題,注意一個元素只能取一次。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=50005; int k,n; int a[maxn]; int vis[maxn]; int flag=0; int Erfen (int target) { int l=0,r=n-1; while (l<=r) { int mid=(l+r)>>1; if(a[mid]==target) { vis[mid]=1; return mid; } else if(a[mid]<target) { l=mid+1; } else { r=mid-1; } } return -1; } int main() { memset (vis,0,sizeof(vis)); scanf("%d%d",&k,&n); for (int i=0;i<n;i++) { scanf("%d",&a[i]); } sort (a,a+n); for (int i=0;i<n;i++) { if(!vis[i]) { vis[i]=1; int tar=k-a[i]; int loc=Erfen(tar); if(loc!=-1&&loc!=i) { printf("%d %d\n",a[i],a[loc]); flag=1; } } } if(!flag) printf("No Solution\n"); return 0; }