题目描述 可爱的演演又来了,这次他想问渣渣一题。。。 如果给你三个数列 A[],B[],C[],请问对于给定的数字

X,能否从这三个数列中各选一个,使得A[i]+B[j]+C[k]=X?

输入 多组数据,你应处理到 EOF。 每组数据的第一行是三个数 L, M, N,分别代表数列 A[],B[],C[]

的长度,接下来三行,每行分别是L, M, N 个数,分别代表数列 A[], B[], C[]。

接下来一行包含一个数S,代表有S组询问。之后的S行每行一个数,代表这组询问的 X。 1<=L, N, M<=500, 1<=S<=1000

; 所有的数都在 32 位整数范围内。

输出 首先对于每组数据输出一行“Case T: ”,T代表数据组数。然后每行对应一组询问,如果能够找到一组满足题目所述条件,输出

YES,否则输出 NO。

样例输入
3 3 3
1 2 3
1 2 3
1 2 3
3
1
4
10 样例输出
Case 1:
NO
YES
NO

思路

  • [ ] 题意:给我们三个序列A[] B[] C[ ]长度长度分别是 a,b,c, 问能否在这三个序列中分别找一个数,使它的和相加等于定值x
  • [ ] 分析:这一题两层for循环一定会炸,所以我们要想办法去优化---->请看代码注释

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int mxn = 505; int main()
{
/* freopen("A.txt","r",stdin); */
int m, n, k;
int a[mxn], b[mxn], c[mxn], d[mxn * mxn];
int Case = 0;
while(scanf("%d %d %d", &m, &n, &k) != EOF)
{
for(int i = 1; i <= m; i ++)
scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++)
scanf("%d", &b[i]);
for(int i = 1; i <= k; i ++)
scanf("%d", &c[i]);
int cnt = 0;
//统计出来所有a、b序列元素相加可能的和
for(int i = 1; i <= m; i ++)
for(int j = 1; j <= n; j ++)
d[cnt ++] = a[i] + b[j];
sort(d, d + cnt); int q, x;
scanf("%d", &q);
printf("Case %d:\n", ++ Case);
while(q --)
{
scanf("%d", &x);
int flag = 0;
for(int i = 1; i <= k; i ++)
{
int l = 0, r = cnt - 1, mid;
//二分去在c中查找某个值使 c[i] + d[mid]== x
while(l <= r)
{
mid = (l + r) >> 1;
if(c[i] + d[mid] == x)
{
flag = 1; break;
}
else if(c[i] + d[mid] < x)
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
if(flag)
break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}

C - 啥~ 渣渣也想找玩数字 HDU - 2141(有序序列枚举 + 二分优化查找)的更多相关文章

  1. 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集

    你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931   GitHub 上有一个 Awesome - XXX 系列 ...

  2. Java中用正则表达式找出数字

    Java中用正则表达式找出数字 1.题目    String str = "fjd789klsd908434jk#$$%%^38488545",从中找出78990843438488 ...

  3. 要想找出以“y”结尾的名字

    要想找出以“y”结尾的名字:mysql> SELECT * FROM pet WHERE name LIKE '%y'“_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)

  4. 要想找出包含“w”的名字

    要想找出包含“w”的名字:mysql> SELECT * FROM pet WHERE name LIKE '%w%'“_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)

  5. 找出数字数组中最大的元素(使用Math.max函数)

    从汤姆大叔的博客里看到了6个基础题目:本篇是第1题 - 找出数字数组中最大的元素(使用Match.max函数) 从要求上来看,不能将数组sort.不能遍历.只能使用Math.max,所以只能从java ...

  6. javascript 找出数字数组中最大的数

    找出数字数组中最大的数 var Match = (function(){ var arr = null; var len = 0; return { max:function(arr,len){ ar ...

  7. LeetCode练习4 找出这两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

  8. python经典算法题目:找出这两个有序数组的中位数

    题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...

  9. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

随机推荐

  1. nginx如何连接多个服务?

    记录一下: 刚开始用nginx部署,在项目文件内touch了一个nginx.conf配置文件,然后将这个conf文件软链接到nginx的工作目录中 sudo ln -s /home/ubuntu/xx ...

  2. Python编程 从入门到实践-3列表下

    笔记出处(学习UP主视频记录) https://www.bilibili.com/video/av35698354?p=5 3.2.3 从列表中删除元素-使用del语句删除元素 motorcycles ...

  3. Docker深入浅出系列 | Swarm多节点实战

    目录 前期准备 Swarm基本概念 什么是Docker Swarm 为什么要用Swarm Swarm的网络模型 Swarm的核心实现机制 服务发现机制 负载均衡机制Routing Mesh Docke ...

  4. java输入输出流操作同一资源实现覆盖引发冲突的解析

    一.问题发生的场景 题目:把s.txt中大写转成小写,小写转成大写,空格转成下划线,在输入到文件中覆盖之前的 前面的没有问题,问题出现在后面的覆盖文件上,输入流.输出流要操作同一个文件的问题 二.小白 ...

  5. Angular入门之环境搭建(VS code)(转载)

    安装Visual Studio Code VS code和我们常用的VS压根不是一回事,它只是一个开源的轻量级编辑器,而不是IDE,因为支持typescript语法,且插件功能丰富,所以选择 官网下载 ...

  6. 视频 embed标签动态改变Src的值,局部刷新播放其他视频的javascript方法

    看图: 视频处html代码: <div id="mod_player" class="mod_player"> <embed id=" ...

  7. Java-方法(新手)

    //创建的一个类.public class zy1ri0319 { //公共静态的主方法. public static void main(String[] args){ //调用方法. zy1(); ...

  8. orale中pl/sql的数据类型总结

    一.pl/sql的概念 pl/sql简单的说就是:sql语句+编程语言的特性. 二.pl/sql的优点 1.可以提高程序的运行效率,因为能够减少数据库的访问次数. 2.可以对复杂的业务逻辑进行封装 3 ...

  9. 2020年Java基础高频面试题汇总(1.4W字详细解析)

    1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...

  10. Andorid 添加MenuPopup