UJN_C++_2007【算法分析】-【第2章 分治算法】查找两数之和为给定数的数对_二分查找
//
Problem A: 【算法分析】-【第2章 分治算法】查找两数之和为给定数的数对
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 62 Solved: 32
[Submit][Status][Web Board]
Description
按从小到大的顺序输入n个整数,再输入一个给定的整数x,在这n个数中找两数之和等于x的数对(可能有多个),找到则输出这两个数,没找到输出“no”
Input
输入有3行,第1行输入整数n,第2行按从小到大的顺序依次输入n个元素,元素间用1个空格分开,第3行输入给定整数x
Output
输出可能有多行,找到数对则输出两个整数,两数间用1个逗号分开,一个数对输出一行,没找到直接输出“no”
Sample Input
4
1 2 4 5
6
Sample Output
1,5
2,4
HINT
用二分搜索实现
//
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+6;
int a[N];
int main()
{
int n,i,ask,temp,x,y,mid,flag;
while( cin>>n )
{
for( i=0;i<n;i++ ) cin>>a[i];
cin>>ask;
flag=1;
for( i=0;i<n;i++ )
{
temp=ask-a[i]; // 数组元素从小到大, temp < 一半, 说明 a[i] > 一半, 后面再无符合条件的数据
if( !( temp>=ask/2 ) ) break;
// temp < ask/2
x=i+1,y=n;
while( x<y )
{
mid=( x+y )>>1;
if( a[mid]==temp ) { flag=0; cout<<a[i]<<','<<temp<<endl; break; }
else if( a[mid]>temp ) y=mid;
else if( a[mid]<temp ) x=mid+1;
}
}
if( flag ) cout<<"no"<<endl; // 特殊处理
}
return 0;
}