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