2016级算法第二次上机-D.Bamboo的饼干
Bamboo的饼干
分析
从两个数组中各取一个数,使两者相加等于给定值。要注意去重和排序
难度不大,方法很多,基本只要不大于O(n^2 ) 的都可以过。本意想考察二分搜索
还可以借助stl中的map,set以及lower_bound等,当然只用数组也可以做。由于数据范围不大,也可以直接用数组下标来计数。
提起去重,有同学似乎一直纠结 (2,3)和(3,2)算不算重复数对..不算!只有(2,1)(2,1)这样的是真·重复对
map
这是很多AC代码用到的方法。因为map的key值是不重复且有序的,因此很适合本题。
参考代码
int n, t, x;
map<int, int> m;
int A[MaxSize];
int main()
{
while(~scanf("%d", &n))
{
m.clear();
int ans = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", &x);
m[x] = 1;
}
for (int i = 0; i < n; ++i) {
scanf("%d", &A[i]);
}
scanf("%d", &t);
sort(A, A+n);
for (int i = n-1; i >= 0; --i) {
long long tem = (long long)t - (long long)A[i];
if(m[tem] > 0)//查询方便
{
ans++;
printf("%lld %d\n", tem, A[i]);
m[tem] = 0;
}
}
if(ans == 0) printf("OTZ\n");
printf("\n");
}
}
数组
此处@周宏建,数组下标计数的方式,与上面map功能相似,注意map键值可为负但是数组下标不可以。当数据范围过大时该方法可能受限。
下面是这位同学上机时的AC代码:
#define bias 10000001
using namespace std;
bool a[20000010];
int b[100005];
int main()
{
int n,x,target;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
bool flag=false;
for(int i=0;i<n;++i)
{
scanf("%d",&x);
a[x+bias]=1;
}
for(int i=0;i<n;++i)
scanf("%d",b+i);
scanf("%d",&target);
sort(b,b+n);
int tmp;
for(int i=n-1;i>=0;--i)
{
tmp=target-b[i]+bias;
if(tmp>=0&&tmp<20000010&&a[tmp])
{
a[tmp]=0;
flag=true;
printf("%d %d\n",target-b[i],b[i]);
}
}
if(!flag)
printf("OTZ\n");
printf("\n");
}
}
数组+二分
这也是非常常见的思路。因为只有两个数,确定一个查找另一个,本质就是个查找。当普通查找TLE时应当会想到用二分查找来做。手写和STL均可。
参考代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxx = 100004;
int a[maxx],b[maxx];
int BinarySearch(int a[], int l ,int r,int val)
{
int mid ;
while(l<=r)
{
mid = (l+r)/2;
if(a[mid]==val)return mid;
else if(a[mid]>val)r = mid-1;
else l = mid+1;
}
return -1;
}
int main()
{
int n,t,tt,pos;
while(~scanf("%d",&n))
{
for(int i = 0;i<n;i++)
scanf("%d",&a[i]);
for(int j = 0;j<n;j++)
scanf("%d",&b[j]);
scanf("%d",&t);
sort(a,a+n);sort(b,b+n);
bool flag = false;
for(int i = 0;i<n;i++)
{
if(i>0&&a[i]==a[i-1])continue;
tt = t-a[i];
pos = BinarySearch(b,0,n-1,tt);
if(pos>-1&&pos<n)
{
printf("%d %d\n",a[i],b[pos]);
flag = true;
}
}
if(flag==false)printf("OTZ\n");
printf("\n");
}
}
当然,因为查找一个数,哈希表还能更快
拓展
请大家思考一下,如果给一个数组找三个数之和为某一值呢?四个数之和呢?
2016级算法第二次上机-D.Bamboo的饼干的更多相关文章
- 2016级算法第二次上机-B.Bamboo的OS实验
Bamboo的OS实验 分析 首先理解题意,要完成不同数量的不同命令,但是完成相同的命令之间必须有n个间隔,为使得时间最短,自然优先用其他命令来填充这n分钟的时间,由于数量少的命令可以用来填充空隙,所 ...
- 2016级算法第二次上机-G.ModricWang's Real QuickSort
873 思路 这是一道非常基础的题,目的是帮助大家回顾快排相关的知识.大家完成此题之后应该就对快排有比较深刻的印象了. 对于整个快排的流程,题目描述中已经给了清晰完整的伪代码.需要自己加工的部分就是, ...
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- 2016级算法第二次上机-E.AlvinZH的儿时梦想——运动员篇
862-AlvinZH的儿时梦想--运动员篇 思路 难题. 应该想到,不管给出的数据如何,每一个淘汰的人不会对最终答案产生任何影响,所以每次淘汰就把人除掉就可以了,最后剩下的两个人计算它们从开始到相遇 ...
- 2016级算法第二次上机-C.AlvinZH的儿时梦想——坦克篇
872 AlvinZH的儿时梦想----坦克篇 思路 简单题.仔细看题,题目意在找到直线穿过的矩形数最小,不能从两边穿过.那么我们只要知道每一行矩形之间的空隙位置就可以了. 如果这里用二维数组记住每一 ...
- 2016级算法第二次上机-A.画个圈圈诅咒你
890 画个圈圈诅咒你 思路 简单题.题目中的圆并没有什么实际作用,简化成线段重合问题会更好理解些. 暴力解法:使用双重for循环会T到想哭,记住最直接的方法一般是过不了题的. 解法一:二分查找.空间 ...
- 题解:2018级算法第二次上机 Zexal的排座位
题目描述: 样例: 实现解释: 一道看似复杂但实际既是斐波那契变形的题目 知识点:递推,斐波那契 通过问题的描述,可以得到以下规律:(除了座位数为一时)男生坐最后时,倒数第二个一定是女生:女生坐最后, ...
- 题解:2018级算法第二次上机 Zexal的流水线问题
题目描述: 样例: 实现解释: 最基础的流水线调度问题,甚至没有开始和结束的值 实现方法即得出状态转移方程后完善即可,设a[][i]存储着第一二条线上各家的时间花费,t[][i]存储着i处进行线路切换 ...
- 题解:2018级算法第二次上机 Zexal的竞赛
题目描述: 样例: 实现解释: 一道需要一点思考的动态规划题目 知识点:动态规划,数据记录 首先将题目描述调整:分别输入不同分数的题目总分(便于后续计算),当获得了i分数的总分后无法获得i-1和i+1 ...
随机推荐
- linux系统如何更改文件权限
一. 更改文件9个属性:chmod 用这个命令修改文件属性有两种方式:数字或者符号 1. 数字类型改变文件权限 chmod (1)类unix系统的文件有9个属性分别是owner/group/other ...
- (转).Net有哪些大型项目、大型网站的案例?
[分享].Net有哪些大型项目.大型网站的案例? .Net开发的部分知名网站案例:http://www.godaddy.com 全球最大域名注册商http://www.ips.com 环迅支付 ...
- 爬虫 之 scrapy-redis组件
scrapy-redis组件 scrapy-redis是一个基于redis的scrapy组件,通过它可以快速实现简单分布式爬虫程序,该组件本质上提供了三大功能: scheduler - 调度器 dup ...
- MQTT协议实现Eclipse Paho学习总结
MQTT协议实现Eclipse Paho学习总结 摘自:https://www.cnblogs.com/yfliufei/p/4383852.html 2015-04-01 14:57 by 辣椒酱, ...
- 【#】Spring3 MVC 注解(二)---@RequestMapping
博客分类: spring MVC 1 问题:有多个 @RequestMapping @controller @RequestMapping("/aaa") ...
- HDU 1104 Remainder (BFS求最小步数 打印路径)
题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将 ...
- WorkFlow 工作流 学习笔记
传统ERP为制造业企业产供销人财物的管理提供了一整套优化企业资源利用,集物流.信息流.资金流为一体的现代化管理工具.但是它在过程集成和企业间集成方面存在不足.具体表现在: 1.传统ERP是一个面向功能 ...
- MVC4 Model ControllerDescriptor
1. ControllerDescriptor 的描述 Controller 的Action 方法有以下一些特性: 1.1 ActionNameAttribute特性 他继承自 System.We ...
- Time 模块中asctime()、time()、localtime()、ctime()、gmtime()的用法
Time 模块包含了以下内置函数,既有时间处理的,也有转换时间格式的: time.asctime([tupletime]) 接受时间元组并返回一个可读的形式“Tue Dec 11 18:07:14 2 ...
- C#设计模式--工厂模式之简单模式
简单工厂模式定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品 ...