题目大意:
已知两个给定的序列,一个升序排列,一个降序排列,在这两个序列中各找一个数,它们加 起来恰好等于 10000。
思路:
由有序联想到二分,遍历其中一个序列,对于遍历的每一个数 x,在另一个序列二分搜索(10000 - x),时间复杂度O(nlogn)。
AC代码:
#include<cstdio>
bool check(int val, int l, int r, int *arr){//二分查找
int mid;
while(l <= r){
mid = (l + r) >> 1;
if(arr[mid] == val){
return true;
}
if(arr[mid] < val){
l = mid + 1;
}
else r = mid - 1;
}
return false;
}
int main(){
int arr[50000], x, last_x;
int size1, size2;
bool res = false;
scanf("%d", &size1);
for(int i = 0; i < size1; i++){
scanf("%d", &arr[i]);
}
scanf("%d", &size2);
for(int i = 0; i < size2; i++){
scanf("%d", &x);
if(i > 0 && x == last_x) continue;//重复的跳过
if(res) continue;//得把数据读完,所以不能break
if(check(10000 - x, 0, size1 - 1, arr)){
res = true;
}
last_x = x;
}
if(res){
printf("YES");
}
else printf("NO");
return 0;
}