UJN_C++_2007【算法分析】-【第2章 分治算法】查找两数之和为给定数的数对_二分查找

这篇博客介绍了如何利用分治算法中的二分搜索策略,来解决在一个有序数组中查找两个数之和等于给定目标值的问题。博主提供了一个C++代码示例,通过循环遍历数组的一半并使用二分搜索来查找匹配的数对,输出符合条件的数对或者在找不到的情况下输出'no'。示例中特别提到了代码的一个小瑕疵,并指出测试数据可能较弱。
摘要由CSDN通过智能技术生成

//
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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这题AC再睡.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值