时间限制:2 秒

内存限制:32 兆

特殊判题:否

提交:3160

解决:833

题目描述:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输入:
每个测试案例包括两行:
第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
第二行包含n个整数,每个数组均为int类型。
输出:
对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
样例输入:
6 15
1 2 4 7 11 15
样例输出:
4 11

思路:

朴素思路是遍历查找,也就是我最初代码中用的方法。复杂度NlogN。

但后来想想,其实根据4xy = (x+y)^2-(x-y)^2,两个数的和一定,那么差越大,积越小,其实只需要找差最大的这一对数即可。可以省掉很多多余的查找。但最坏的复杂度仍然是NlogN。

进一步的优化思路能够将复杂度下降到线性:两个数A和B分别从最左侧和最右侧向中间搜索,每次循环中,固定A,从上次搜索到的B开始下降搜索。最终的复杂度将是N。

PS:这个题的测试数据不是太好,我试了朴素思路和优化思路,结果竟然相差不大。

代码:

#include <stdio.h>

#define N 1000000

int search(int *a, int begin, int end, int x)
{
int len = end - begin;
if (len <= 0)
return -1;
if (len == 1)
{
if (a[begin] == x)
return begin;
else
return -1;
} int mid = begin + len/2;
if (a[mid] == x)
return mid;
else if (x < a[mid])
return search(a, begin, mid, x);
else
return search(a, mid+1, end, x);
} int main(void)
{
int n, k, i, j;
int a[N]; while (scanf("%d%d", &n, &k) != EOF)
{
for(i=0; i<n; i++)
scanf("%d", &a[i]); for (i=0; i<n-1; i++)
{
j = search(a, i+1, n, k-a[i]);
if (j > i)
break;
else
continue;
} if (i == n-1)
printf("-1 -1\n");
else
printf("%d %d\n", a[i], a[j]);
} return 0;
}
/**************************************************************
Problem: 1352
User: liangrx06
Language: C
Result: Accepted
Time:1520 ms
Memory:4748 kb
****************************************************************/

优化代码:

<pre name="code" class="cpp">#include <stdio.h>

#define N 1000000

int main(void)
{
int n, k, i, j;
int a[N]; while (scanf("%d%d", &n, &k) != EOF)
{
for(i=0; i<n; i++)
scanf("%d", &a[i]); i = 0, j = n-1;
while (i < j) {
if (a[i] + a[j] == k)
break;
else if (a[i] + a[j] < k)
i++;
else
j--;
} if (i == j)
printf("-1 -1\n");
else
printf("%d %d\n", a[i], a[j]);
} return 0;
}
/**************************************************************
Problem: 1352
User: liangrx06
Language: C
Result: Accepted
Time:1450 ms
Memory:4748 kb
****************************************************************/

												

九度OJ 1352:和为S的两个数字 (查找)的更多相关文章

  1. 九度OJ 1352 和为S的两个数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1352 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和 ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. 九度OJ 1357:疯狂地Jobdu序列 (数字特性)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:715 解决:263 题目描述: 阳仔作为OJ的数据管理员,每一周的题目录入都让其很抓狂,因为题目不是他出的,他控制不了出题的速度--在等题目 ...

  4. 九度OJ 1534 数组中第K小的数字 -- 二分查找

    题目地址:http://ac.jobdu.com/problem.php?pid=1534 题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C. 譬如A为[1,2],B为[ ...

  5. 九度OJ 1370 数组中出现次数超过一半的数字

    题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...

  6. 九度oj 题目1256:找出两个只出现了一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的第一行包括一个整数N(1<=N<=1000). 接下来的一行包括N个 ...

  7. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  8. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  9. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

随机推荐

  1. functor

    I thought it would be easy and convenient to define a small functor and perform a customized sort on ...

  2. 面试——谈谈对JAVA的理解

    谈谈你对Java平台的理解.答:Java首先是一种面向对象的语言,语言特性有封装,继承,多态,泛型,Lamda表达式等; 第二个特性:支持跨平台,一次书写导出运行(write once,run any ...

  3. 配置php扩展memcache

    配置php扩展memcache 环境说明: 系统版本    CentOS 6.9 x86_64         软件版本    nginx-1.12.2        php-5.5.38       ...

  4. ANGULARJS: UNDERSTANDING DIRECTIVE SCOPE

    https://www.3pillarglobal.com/insights/angularjs-understanding-directive-scope --------------------- ...

  5. Asp.net问题集锦

    1.在Web应用开发中经常碰到这样的情况,Dropdownlist绑定的数据太多,用户要选择某一项必须从头找到尾,使用起来很不方便.最近我在工作中就碰到这种情况,公司内某个业务系统需要绑定几百条的厂家 ...

  6. eclipse黄色警告(finally block does not complete normally) ,不建议在finally中使用return语句

    在eclipse中编写例如以下的代码,eclipse会给出黄色告警:finally block does not complete normally. public class Test { publ ...

  7. 【转载】深入理解JVM性能调优

    性能问题无非就这么几种:CPU.内存.磁盘IO.网络.那我们来逐一介绍以下相关的现象和一些可能出现的问题. 一.CPU过高. 查看CPU最简单的我们使用任务管理器查看,如下图所示,windows下使用 ...

  8. 已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”

    题目:已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”. 代码: <!DOCTYPE html> &l ...

  9. 強大的Selector框架

    代码地址如下:http://www.demodashi.com/demo/12648.html 前言 在开发的过程中,我们经常会遇到给view设置背景,什么圆形背景啊,圆角背景啊,点击变色背景啊之类的 ...

  10. Windows 清除系统垃圾文件

    @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._m ...