51Nod 1001 数组中和等于K的数对

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 //}

 

原文地址:https://www.cnblogs.com/tornado549/p/8724279.html