repeat_查找两数之和为给定数的数对_二分查找

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;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/123587141