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