C - 啥~ 渣渣也想找玩数字 HDU - 2141(有序序列枚举 + 二分优化查找)
题目描述 可爱的演演又来了,这次他想问渣渣一题。。。 如果给你三个数列 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(有序序列枚举 + 二分优化查找)的更多相关文章
- 你想找的Python资料这里全都有!没有你找不到!史上最全资料合集
你想找的Python资料这里全都有!没有你找不到!史上最全资料合集 2017年11月15日 13:48:53 技术小百科 阅读数:1931 GitHub 上有一个 Awesome - XXX 系列 ...
- Java中用正则表达式找出数字
Java中用正则表达式找出数字 1.题目 String str = "fjd789klsd908434jk#$$%%^38488545",从中找出78990843438488 ...
- 要想找出以“y”结尾的名字
要想找出以“y”结尾的名字:mysql> SELECT * FROM pet WHERE name LIKE '%y'“_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)
- 要想找出包含“w”的名字
要想找出包含“w”的名字:mysql> SELECT * FROM pet WHERE name LIKE '%w%'“_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)
- 找出数字数组中最大的元素(使用Math.max函数)
从汤姆大叔的博客里看到了6个基础题目:本篇是第1题 - 找出数字数组中最大的元素(使用Match.max函数) 从要求上来看,不能将数组sort.不能遍历.只能使用Math.max,所以只能从java ...
- javascript 找出数字数组中最大的数
找出数字数组中最大的数 var Match = (function(){ var arr = null; var len = 0; return { max:function(arr,len){ ar ...
- LeetCode练习4 找出这两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- python经典算法题目:找出这两个有序数组的中位数
题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...
- T2988 删除数字【状压Dp+前缀和优化】
Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...
随机推荐
- 【猫狗数据集】pytorch训练猫狗数据集之创建数据集
猫狗数据集的分为训练集25000张,在训练集中猫和狗的图像是混在一起的,pytorch读取数据集有两种方式,第一种方式是将不同类别的图片放于其对应的类文件夹中,另一种是实现读取数据集类,该类继承tor ...
- 面试官系统精讲Java源码及大厂真题系列之Java线程安全的解决办法
1. 背景 1.1 static修饰类变量.方法.方法块. public + static = 该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 1.2 多个线程同时 ...
- Day1T1仓鼠的石子游戏——博弈论
打比赛的时候还没学博弈论,打完下来花了半个多小时学完,发现这题就是一道\(SG\)函数 其实当时差一点就\(YY\)出了答案,但是后面太难想,所以没整出来 机房大佬们都说自己没学博弈论,但是都AC 题 ...
- CF1082B Vova and Trophies 题解
CF1082B Vova and Trophies 题解 瞎搞题,推荐的,一看是道水题,就随手A了-- 题目描述 Vova has won \(n\)trophies in different com ...
- [BUG]微信小程序生成小程序码"小程序页面路径不存在,请重新输入"
描述 小程序页面线上能打开. 微信官方 获取小程序页面小程序码 页面 ,输入 小程序页面路径,提示 "小程序页面路径不存在,请重新输入". 使用微信复制小程序路径方法, 也是同样的 ...
- 创建和存储 cookie
在这个例子中我们要创建一个存储访问者名字的 cookie.当访问者首次访问网站时,他们会被要求填写姓名.名字会存储于 cookie 中.当访问者再次访问网站时,他们就会收到欢迎词. 首先,我们会创建一 ...
- cocosCreator定制小游戏构建模板
cocosCreator定制小游戏构建模板 1. 解决痛点 在开发微信小游戏过程中,需要在微信小游戏game.json加入一个配置键navigateToMiniProgramAppIdList,但常规 ...
- 补充JavaScript
1 JavaScript概述 1.1 ECMAScript和Javascript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准 ...
- SQL 分组内求最大N个或最小N个
题目描述 表 Employee +----+-------+--------+--------------+ | Id | Name | Salary | DepartmentId | +----+- ...
- ArrayList的传值问题
ArrayList是一个对象类型,记录一下遇到的传值问题 假设两个ArrayList类型的值a和b,a有值,b无值,想把a的值全部复制给b. 如果使用 b = a; 进行赋值,会将a的地址赋值给b,当 ...