1. 程式人生 > >51Nod 1001 數組中和等於K的數對

51Nod 1001 數組中和等於K的數對

Go pro mic bsp amp col lse else nbsp

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1001
一開始的想法是排序後二分搜索,發現會進行非常多不必要的遍歷,十分耗時間。
解決方法:在得到一對數之後順便令數組長度進行縮短能夠有效減少運行時間。

1
#include<iostream> 2 #include<algorithm> 3 using namespace std; 4 //int bs(int key,int num,int i,int n[],int sum); 5 6 int main() 7 { 8 int sum,num;
9 cin >> sum >> num; 10 int n[num]; 11 for(int i=0; i<num; i++) 12 { 13 cin >> n[i]; 14 } 15 sort(n,n+num); 16 int left = 0; 17 int f=0; 18 int right = num-1; 19 while(left < right) 20 { 21 if((sum-n[left])==n[right]) 22
{ 23 f=1; 24 cout << n[left] << << sum - n[left] << endl; 25 right--; 26 left++; 27 } 28 else if((sum-n[left])>n[right]) 29 { 30 left++; 31 } 32 else if((sum-n[left])<n[right])
33 { 34 right--; 35 } 36 } 37 38 39 40 // t=bs(n[i],num,i,n,sum); 41 // if(t) 42 // { 43 // cout << n[i] << ‘ ‘ << sum - n[i] << endl; 44 // } 45 46 // for(int i=0;res[i][1]!=0&&(res[i][1]!=res[i][0]);i++) 47 // { 48 // cout << res[i][0] << ‘ ‘ << res[i][1] << endl; 49 // f=1; 50 // } 51 if(f==0) 52 cout << "No Solution"; 53 return 0; 54 } 55 56 //int bs(int key,int num,int left,int n[],int sum) 57 //{ 58 // int right = num; 59 // int mid; 60 // while(left < right) 61 // { 62 // mid = (left + right) / 2; 63 // if((sum-key)==n[mid]) 64 // return n[mid]; 65 // else if((sum-key)>n[mid]) 66 // left = mid; 67 // else if((sum-key)<n[mid]) 68 // right = mid; 69 // } 70 // 71 // return 0; 72 //}

51Nod 1001 數組中和等於K的數對