HDOJ2141(map在二分查找中的应用)

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std ;
#define M 500 + 10
int a[M] ;
int b[M] ;
int c[M] ;
int d[M] ;
int l ;
int n ;
int m ;
map <int , bool > Map ;
void Marge()
{
    for(int i = 0 ;i < l ; ++ i)
        for(int j = 0 ;j < n ; ++ j)
            Map[a[i] + b[j]] = 1 ;
}
bool Check(int x)
{
    int tem ;
    for(int i = 0 ;i <l ; ++ i)
    {
        tem = x - c[i] ;
        if(Map[tem])    return    true ;
    }
    return false ;
}
int main()
{
    int s ;
    int x ;
    int T = 1 ;
    while(scanf("%d%d%d",&l ,&n , &m) != EOF )
    {
        for(int i = 0 ;i < l ; ++ i)
            scanf("%d",a + i) ;
        for(int i = 0 ;i < n ; ++ i)
            scanf("%d",b + i) ;
        for(int i = 0 ;i < m ; ++ i)
            scanf("%d",c + i) ;
        scanf("%d",&s) ;
        printf("Case %d:\n",T ++) ;
        Marge() ;
        while(s --)
        {
            scanf("%d",&x) ;
            if(Check(x)) puts("YES") ;
            else puts("NO") ;
        }
        Map.clear() ;
    }
    return 0 ;
}
时间: 2024-08-10 02:11:16

HDOJ2141(map在二分查找中的应用)的相关文章

HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第一种是行交换操作,就是把矩阵的两行进行交换,另一种是列交换操作,注意两种操作都要求行或列至少要有一个水果,第三种操作是查找,询问第A行B列的水果的能量值,如果查询的位置没有水果,则输出0. 因为n和m都很大,达到了2*10^9,但水果最多一共只有10^5个,我的做法是直接用结构体存了之后排序,然后m

关于二分查找中的一些问题

相信对于学习编程每一个同学来说,肯定都知道二分查找算法,并且写过相应的测试代码,那么我们先来说一下二分查找的的优缺点吧. 这大家都很清楚,优点呢就是二分查找是折半查找,每次查找都可以排除一半的数据,这应用在一个大数据量的查找中,效率是非常高的.当然了,缺点也很明显,就是二分查找的前提是,查找的数据一定是经过排序的,无论是升序还是降序,这会打乱原先的数据的位置.所以在实际情况中,还请大家仔细考虑,是否需要进行二分查找. 话不多说,我们直接上代码. public class Main{ public

二分查找中的死循环

二分算法是我们经常会用到的一个算法.它是分治法的一个应用.不过,虽然他写起来貌似很简单,但是却很容易写错.下面我们讨论一下二分的死循环问题.(这里讨论的是整数的二分问题,浮点数的二分不容易死循环) 1.查找的元素确定,值唯一或者不存在 这种情况等下,我们的流程分为三个分支:(相等.小于.大于).这类不容易死循环,代码如下: if ( data[mid] == key ) return mid; if ( data[mid] > key ) r = mid-1; else l = mid+1; 2

18.07.20(lambda().sorted().filter().map().递归.二分查找)

1.lambda() 匿名函数 lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明一个函数 语法:函数名 = lambda 参数:返回值 注意: (1)参数可以有多个,多个参数用逗号隔开 (2)匿名函数不管多复杂.只写一行.且逻辑结束后直接返回数据 (3)返回值和正常函数一样1,可以是任意数据类型 我们通过__name__()查看函数名字 例: a = lambda x : x * xprint(a(5)) ==>25print(a.__name__) ==><lamb

二分查找的改进--差值查找

差值查找 在二分查找中,我们每次比较都可以排除一半的数据量,这个已经是很高效了.如果利用关键字本身的信息,每次排除的数据量充分依赖于关键字的大小,则查找会更高效,这就是差值查找的思想. 下面通过示例代码,比较二分查找和差值查找的不同,在不同中领略差值查找的改良之处. #include <stdio.h> #include <stdlib.h> int InterSearch(int *array, int n, int key) { if (array && n &

检索算法——二分查找

如果要查找的数据是有序的, 二分查找算法比顺序查找算法更高效. function insertionSort(arr) { var temp, inner; for ( var outer = 1; outer < arr.length; ++outer) { temp = arr[outer]; //选中一个值作为临时值,使得其前面的数依次与它进行比较 inner = outer; while (inner > 0 && (arr[inner - 1] >= temp)

二分查找算法(递归,循环)

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:    1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>6,

二分查找 : 那个隐藏了 10 年的 Java Bug

一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题.在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那就是去实现二分查找. 因为它很好写,却很难写对.可以想象问了这道题后,在5分钟之内面试的同学会相当自信的将那一小段代码交给我们,剩下的就是考验面试官能否在更短的时间内看出这段代码的bug了. 二分查找是什么呢,这个不只程序员,其他很多非技术人员也会.比如我想一个1到100以内的数,你来猜,我告诉你每次猜的是大了还是小了,你会先猜50,然后

详解二分查找算法

我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解:思路很简单,细节是魔鬼. 本文就来探究几个最常用的二分查找场景:寻找一个数.寻找左侧边界.寻找右侧