openjudge 和为给定数(二分答案)

嗯...

 

题目链接:http://noi.openjudge.cn/ch0111/07/

 

这道题是一道不太明显,但很好二分的二分答案的一道题...

 

首先排序(二分要满足单调性),然后枚举每一个数,在[i + 1,n]区间中二分查找,如果有能和它匹配的数,直接输出即可...

 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int a[100005];
 8 
 9 inline int er_fen(int l, int r, int x){
10     while(l <= r){
11         int mid = (l + r) >> 1;
12         if(a[mid] == x) return 1;
13         else if(a[mid] > x) r = mid - 1;
14         else if(a[mid] < x) l = mid + 1;
15     }
16     return 0;
17 }
18 
19 int main(){
20     int n, m;
21     scanf("%d", &n);
22     for(int i = 1; i <= n; i++){
23         scanf("%d", &a[i]);
24     }
25     sort(a + 1, a + n + 1);
26     scanf("%d", &m);
27     for(int i = 1; i <= n; i++){
28         int t = m - a[i];
29         if(er_fen(i + 1, n, t)) {printf("%d %d\n", a[i], t); return 0;}
30     }
31     printf("No\n");
32     return 0;
33 }
AC代码

 

posted @ 2019-08-12 21:37  dfydn  阅读(266)  评论(0编辑  收藏  举报