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 ... 
随机推荐
- Jenkins持续集成构建
			配置Sonar.Jenkins进行持续审查 http://go2live.cn/archives/38261.html Jenkins iOS 项目持续集成 http://go2live.cn/arc ... 
- 633E Binary Table
			传送门 分析 我们发现n特别小,所以可以从这里入手 我们记录出所有列中某一种状态的列有多少个 我们再记录出每种列最少有多少个1(原来的1的个数和取反后的个数去最小值) 于是我们可以得出对于所有列异或一 ... 
- meshconverters
			https://github.com/RobotLocomotion/meshConverters meshconverters $ mkdir build && cd build $ ... 
- JMS学习之理论基础
			本文代码使用ActiveMq5.6 一.什么是JMS JMS(Java Message Service,Java消息服务)是一组Java应用程序接口(Java API),它提供创建.发送.接收.读取消 ... 
- mysqli_query(“set nams utf8”)为FALSE
			经过过测试: mysqli_query("set nams utf8")必须在所有语句的执行之前,否则会返回FALSE. 看手册,说不建议用mysqli_query来设置编码,用 ... 
- python 文件操作(二)
			一. 文件的读写 1.找到文件 文件路径:./test.py 2.打开文件 open('文件路径','模式') 模式: r, 以只读的方式打开 w, 打开一个文件只用于写入,如文件已存在,直接重 ... 
- mybatis-generator命令行生成代码
			目录文件如下: generator.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <!DOC ... 
- Typora的图片根目录设置,
			需求:使Typora的图片,设置到指定的文件里. 方便上传与转移. 步骤: 1 位置: 编辑 ->图片工具->设置图片根目录. 2 .Preference -> Editor -&g ... 
- react+webpack基础学习配置
			最近学习react,公司的项目是使用create-react-app来搭建的,而我想重新使用node+mysql+react来搭建一个新的博客. 今天尝试从零开始搭建一个webpack+react项目 ... 
- 编写高质量代码改善C#程序的157个建议——建议109:谨慎使用嵌套类
			建议109:谨慎使用嵌套类 使用嵌套类的原则是:当某类型需要访问另一个类型的私有成员时,才将它实现为嵌套类.一个典型的例子是在实现集合时,要为集合实现迭代器,这时用到了嵌套类.代码如下所示: publ ... 
