zoukankan      html  css  js  c++  java
  • Openjudge-NOI题库-和为给定数

    题目描述 Description

    给出若干个整数,询问其中是否有一对数的和等于给定的数。
     输入输出格式 Input/output
    输入格式:
    共三行:
    第一行是整数n(0 < n <= 100,000),表示有n个整数。
    第二行是n个整数。整数的范围是在0到10^8之间。
    第三行是一个整数m(0 <= m <= 2^30),表示需要得到的和。
    输出格式:
    若存在和为m的数对,输出两个整数,小的在前,大的在后,中间用单个空格隔开。若有多个数对满足条件,选择数对中较小的数更小的。若找不到符合要求的数对,输出一行No。
     输入输出样例 Sample input/output
    样例测试点#1

    输入样例:

    4

    2 5 1 4

    6

    输出样例:

    1 5

    思路:这题用二分查找最快,先把数组从小到大排序(我这用的是快排,目的是为了满足题目条件中的"若有多个数对满足条件,选择数对中较小的数更小的")

    代码如下:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int fun(const void *a,const void *b)
     4 {
     5     return *(int*)a-*(int*)b;
     6 } 
     7 int main()
     8 {
     9     int n,a[100002],m;
    10     int i,l;
    11     int r,mid;
    12     scanf("%d",&n); 
    13     for(i=1;i<=n;i++)
    14     {
    15         scanf("%d",&a[i]);
    16     }
    17     qsort(a+1,n,sizeof(int),fun);//选出小的更小 
    18     scanf("%d",&m);
    19     for(i=1;i<=n;i++)
    20     {
    21         l=i+1;//
    22         r=n;//
    23         while(l<=r)
    24         {
    25             mid=(l+r)/2;
    26             if(a[mid]==m-a[i]) break;//找到了 
    27             else if(a[mid]>m-a[i]) r=mid-1;//中间大于,右往左移 
    28             else l=mid+1;//否则左边右移 
    29         }
    30         if(a[mid]==m-a[i])//输出结果 
    31         {
    32             printf("%d %d
    ",a[i],m-a[i]);
    33             return 0;
    34         }
    35     }
    36     printf("No
    ");//没有 
    37     return 0;
    38 }
  • 相关阅读:
    ABP理论学习之Swagger UI集成
    最佳加法表达式
    洛谷 P1736 创意吃鱼法
    洛谷P1387 最大正方形
    1078 最小生成树
    判断元素是否存在
    1531 山峰 【栈的应用】
    洛谷 P2335 [SDOI2005]位图
    矿藏估价
    二分法小结
  • 原文地址:https://www.cnblogs.com/geek-007/p/5667447.html
Copyright © 2011-2022 走看看