1001 数组中和等于K的数对——51NOD
2018-01-08 14:26
295 查看
这是我在51nod上做的第一道一级算法题,感觉51nod的低级题也没那么难嘛,这就是一道划水题,简单的二分查找就可解了。
我有两种解法,第一种想来效率没二分高,就是排序后分别从头和从后遍历,然后头指针只能向后,尾指针只能向前,这样就避免了一些重复,但是具体会不会TLE就没去尝试了。
第二种解法就是二分查找,我是在二分里揉进了第一种的思想,也避免了一部分重复,当然其实对于二分而言这点小重复也不会有太大的影响了,毕竟是O(log n)的复杂度。然后如果前后指针相遇的时候就不用重复了,所以我的复杂度应该是O(nlogn)
题目如下:
代码:
我有两种解法,第一种想来效率没二分高,就是排序后分别从头和从后遍历,然后头指针只能向后,尾指针只能向前,这样就避免了一些重复,但是具体会不会TLE就没去尝试了。
第二种解法就是二分查找,我是在二分里揉进了第一种的思想,也避免了一部分重复,当然其实对于二分而言这点小重复也不会有太大的影响了,毕竟是O(log n)的复杂度。然后如果前后指针相遇的时候就不用重复了,所以我的复杂度应该是O(nlogn)
题目如下:
代码:
#include<bits/stdc++.h> using namespace std; #define LL long long #define MAX_LEN 50001 int sum=0; int searchAndOutput(LL *a,int start,int tail,LL k) { LL need = k-a[start]; start++; int s=start,t=tail,m; m=(tail-start)/2; while(s <= t) { if(a[m] == need) { if(a[start-1] == a[m]) { return tail; } cout<<a[start-1]<<" "<<a[m]<<endl; sum++; return m; } if(a[m] > need) { t = m-1; m=(s+t)/2; } else if(a[m] < need) { s = m+1; m=(s+t)/2; } } return tail; } int main() { LL k; int n; cin>>k>>n; int t=n; LL a[MAX_LEN]; while(n--) { cin>>a ; } n=t-1; sort(a,a+t); int i=0; while(i<n) { n=searchAndOutput(a,i,n,k); i++; } if(sum == 0) { cout<<"No Solution"<<endl; } }
相关文章推荐
- 【51Nod】1001 数组中和等于K的数对
- [51NOD] 1001 数组中和等于K的数对 [二分]
- 51nod --1001 数组中和等于K的数对(一级算法题)
- 51Nod-1001 数组中和等于K的数对【排序+二分查找】
- 【51nod】-1001 数组中和等于K的数对(思维)
- 51Nod 1001 数组中和等于K的数对 (二分)
- 51nod 1001 数组中和等于K的数对(二分)
- 51nod 1001 数组中和等于K的数对(二分)
- 51nod_1001 数组中和等于K的数对(二分)
- 51Nod 1001 数组中和等于K的数对 And 1015 水仙花数
- 51Nod 1001 数组中和等于K的数对 And 1015 水仙花数
- 51nod-【1001 数组中和等于K的数对】
- 51nod 1001 数组中和等于K的数对【二分】
- 51nod 1001 数组中和等于K的数对 (奇技淫巧
- 51nod 1001 数组中和等于K的数对
- 51nod 1001 数组中和等于K的数对
- 51nod 1001 数组中和等于K的数对
- 51nod 1001 数组中和等于K的数对(尺取法)
- 51Nod 1001 数组中和等于K的数对
- 【51Nod】1001 - 数组中和等于K的数对(STL)