acwing_800_数组元素的目标和

800. 数组元素的目标和

给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。
请你求出满足A[i] + B[j] = x的数对(i, j)。

数据保证有唯一解。

输入格式

第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。

第二行包含n个整数,表示数组A。

第三行包含m个整数,表示数组B。

输出格式

共一行,包含两个整数 i 和 j。

数据范围

数组长度不超过100000。
同一数组内元素各不相同。
1≤数组元素≤1091≤数组元素≤109

输入样例:

4 5 6
1 2 4 7
3 4 6 8 9

输出样例:

1 1

思想:这到题目需要用到双指针的算法,用一个指针i指向数组a,用另一个指针j指向数组b,我们需要找到的是当a[i] +  a[j] = x 的i与j那么当我们找到i对应的j的范围(a[i] + b[j] < x )为【1,di]时,那么i + 1 指针所对应的j也一定在[1,di]这个范围类,所以当我们去寻找j的时候可以使用二分去找,这样我们算法的总体的时间复杂度就为:nlogn,AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], b[maxn];

inline void read(int &w) {
     char c = getchar();
     w = 0;
     int reg = 1;
     while(c < ‘0‘ || c > ‘9‘) {
         if(c == ‘-‘) reg = -1;
         c = getchar();
     }
     while(c >= ‘0‘ && c <= ‘9‘) {
         w = w * 10 + c - ‘0‘;
         c = getchar();
     }

    w *= reg;
}

inline int binary_sort(int l, int r, int x, int y) {
    while(l < r) {
        int mid = (l + r + 1) / 2;
        if(x + b[mid] <= y) l = mid;
        else r = mid - 1;
    }

    return l;
}

int main(void) {
//    freopen("in.txt", "r", stdin);

    register int n, m, x;
    read(n), read(m), read(x);
    for(int i = 1; i <= n; i ++) read(a[i]);
    for(int i = 1; i <= m; i ++) read(b[i]);

    int i = 1, j = 1, di = m, x1, x2, flag = 0;
    for(i = 1; i <= n; i ++) {
        int tmp = binary_sort(1, di, a[i], x);
        if(a[i] + b[tmp] == x) { x1 = i, x2 = tmp; break; }
        else di = tmp;
    }

    printf("%d %d\n", x1 - 1, x2 - 1);

//    fclose(stdin);
    return 0;
}

原文地址:https://www.cnblogs.com/phaLQ/p/11106009.html

时间: 2024-08-30 06:05:12

acwing_800_数组元素的目标和的相关文章

AcWing&#160;800.&#160;数组元素的目标和

网址 https://www.acwing.com/solution/AcWing/content/2064/ 题目描述给定两个升序排序的有序数组A和B,以及一个目标值x,请你求出满足A[i] + B[j] = x的数对(i, j). 数据保证有唯一解. 输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x. 第二行包含n个整数,表示数组A. 第三行包含m个整数,表示数组B. 输出格式共一行,包含两个整数 i 和 j. 数据范围数组长度不超过1000000.同一数组内元素

JavaScript中数组元素的线性搜索

线性搜索:将给定的数组元素一个接一个的与我们需要查找的元素进行比较. 示例:1.该示例通过prompt()函数实现用于输入需要查找的元素. 2.给定一组数组元素 3.将查询结果通过set_innerHTML()函数输出到指定页面标签内. (注:set_innerHTML()函数弥补JavaScript的innerHTML属性,JavaScript的innerHTML属性不能进行网页交互时输出.即网页交互时使用innerHTML属性JavaScript程序无响应.) <!doctype html>

PHP数组元素函数的整理

php数组元素的整理   1.Count() 计算数组中元素的个数: 2.Array_values(array $input) 以索引数组的形式返回数组中所有 元素的值 只需一个数组做参数,将关联数组转化成数字索引数组: 3.Array_keys(array$array[,mixed$search_value[,bool$strict=false]]返回数组中 部分的或所有的键名,二维数组时只显示第一层的键名 4.in_array(mixed$needle,array$haystack[,boo

Java 数组元素复制的三种方法

一.将数组元素逐个复制到目标数组中 例1 //源数组 int[] source = {10,30,20,40}; //目标数组 int[] target = new int[source.length]; for (int i = 0;i < source.length;i++){ target[i] = source[i]; } 二.使用System类的arraycopy()方法 public static void arraycopy(Object src,int srcPos,Object

1008. 数组元素循环右移问题 (20)

1008. 数组元素循环右移问题 (20) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1--AN-1)变换为(AN-M -- AN-1 A0 A1--AN-M-1)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100).M(M>=0):第2行输入N个整数,之间用空格

js删除数组元素中的指定值

js删除数组元素中的指定值:所谓删除数组元素中指定的值,就是删除具有指定的数组项,下面就通过实例代码代码介绍一下如何实现此功能.代码如下: var theArray=["蚂蚁部落",2,"青岛市南区","antzone","蚂蚁部落"]; for(var i=0;i<theArray.length;i++){ if(theArray[i]=="蚂蚁部落"){ theArray.splice(i,1);

用指针引用数组元素并打印输出

<span style="font-size:18px;">#include<stdio.h> void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//数组指针变量声明 int row,col; p=a;//指针p指向数组元素为4的数组 //打印输出数组指针p指向的数组的值 for(row=0;row<3;row++) { for(col=0;col<4;

php统计数组元素个数

count():对数组中的元素个数进行统计; sizeof():和count()具有同样的用途,这两个函数都可以返回数组元素个数.可以得到一个常规标量变量中的元素个数,如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0; array_count_value():统计每个特定的值在数组$array中出现过的次数; 如: $array=array(4,5,1,2,3,1,2,1); $ac=array_count_value($array); 将创建一个名为

js删除数组元素、清空数组的简单方法

一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删除数组元素 var ary = [1,2,3,4]; ary.splice(0,1); 或 ary.splice($.inArray(2, ary), 1); 其中$.inArray(2, ary)用来查找某元素在数组中的索引位置.