zoukankan      html  css  js  c++  java
  • 和为给定数

    【题目描述】

    给出若干个整数,询问其中是否有一对数的和等于给定的数。

    【输入格式】

    共三行:
    第一行是整数n(0 < n <= 100,000),表示有n个整数。
    第二行是n个整数。整数的范围是在0到10^8之间。
    第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。

    【输出格式】

    若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。

    【分析】

    我们枚举每一个数,用普通的二分查找判断m-a[i]是不是其中的一个数,我们如果返回值是布尔类型,可能会错。

    提供一个样例:

    3

    1 1 3

    6

    输出应为No。

    因为只有一个3,所以我们就返回位置,如果位置和原来的位置相同,即i=j,那么我们就输出No。

    【代码】

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long ll;
     5 int n,m;
     6 int a[100010];
     7 int check(int x){
     8     int l=0,r=n+1;
     9     while(l<r){
    10         int mid=(l+r)>>1;
    11         if(a[mid]==x)return mid;
    12         else if(a[mid]>x) r=mid;
    13         else l=mid+1;
    14     }
    15     return -1;
    16 }
    17 int main()
    18 {
    19     scanf("%d",&n);
    20     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    21     sort(a+1,a+1+n);
    22     scanf("%d",&m);
    23     bool flag=true;
    24     for(int i=1;i<=n;i++){
    25         if(check(m-a[i])!=-1&&check(m-a[i])!=i){
    26             printf("%d %d
    ",a[i],m-a[i]);
    27             flag=false;
    28             break;
    29         }
    30     }
    31     if(flag)printf("No
    ");
    32     return 0;
    33 }
    黎明的朝阳,会为苦难中最坚强的信念升起
  • 相关阅读:
    设置数据库某字段为当前时间
    HashMap源码解析(只为吊打面试官)
    SRAM 静态内存芯片 IS62WV51216 的使用 STM32F407ZGT6
    手机ARM种类,STM32中的ARM核又是什么东东?
    运算放大器 常用经典电路 计算书
    SMT 生产线设备 (PCBA)
    横机 电控设计
    ISO26262 标准
    质量管理体系(16949)的五大工具
    IATF16949和TS16949有什么不同?
  • 原文地址:https://www.cnblogs.com/Dawn-Star/p/9156437.html
Copyright © 2011-2022 走看看