//
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=1e6+7;
int a[N];
int main()
{
int n,aim,flag;
int i,x,y,mid,temp;
while( ~scanf("%d",&n) )
{
for( i=0;i<n;i++ ) scanf("%d",&a[i]);
scanf("%d",&aim);
// 5 1 2 3 6 7 13
// no
// 当时AC了就没再看 后来复习发现这里有一点小瑕疵 ( i<=n/2 )
// 看来测试数据比较弱呀
for( flag=1,i=0;i<=n/2;i++ )
{ // 左闭右开型 x=i+1,y=n!!!
x=i+1,y=n,temp=aim-a[i];
while( x<y )
{
mid=( x+y )>>1; // ,
if( a[mid]==temp ) { flag=0,printf("%d,%d\n",a[i],a[mid]); break; }
else if( a[mid]>temp ) y=mid;
else if( a[mid]<temp ) x=mid+1;
} // 找下标 循环里面就解决
}
if( flag ) printf("no\n");
}
return 0;
}
// 0
// x y mid
// 1 3 2
// 2 3 2