UVa10474 Where is the Marble ? 有序数组二分找值 lower_bound / upper_bound

题意:

给出n个数,先把各数从小到大排序,然后q次询问xi在数组中的位置,不存在则输出相应信息。

输入样例:

4 1

2

3

5

1

5

5 2

1

3

3

3

1

2

3

0 0

输出样例:

CASE# 1:

5 found at 4

CASE# 2:

2 not found

3 found at 3

//=======================================

数组从小到大有序。

lower_bound :查找“大于或者等于x”的第一个位置。

upper_bound:查找“大于x”的第一个位置。

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 5;
int a[maxn];

int main()
{
    int cas = 1, x;
    int n, q;
    while(~scanf("%d%d", &n, &q)) {
        if(n==0&&q==0) break;
        for(int i=1; i<=n; ++i) {
            scanf("%d", &a[i]);
        }
        sort(a+1, a+n+1);
        printf("CASE# %d:\n", cas++);
        while(q--){
            scanf("%d",&x);
            int p = lower_bound(a+1, a+n+1, x) - a;
            if(a[p]==x){ printf("%d found at %d\n", x, p);}
            else printf("%d not found\n", x);
        }
    }
    return 0;
}
时间: 2024-11-06 15:05:25

UVa10474 Where is the Marble ? 有序数组二分找值 lower_bound / upper_bound的相关文章

两个有序数组,找第k小的数//未完

1.题目描述:a,b两个有序数组,找出第k小的数,logk,二分查找,1个小于怎么办? 2.思路: 对于数组A . B , 如果 B[pb] < A[pa] && B[pb] > A[pa - 1], 那么 B[pb] 一定是第 pa + pb + 1  小的数.比如数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110},pa = 2, pb = 1, 这时,(B[pb] = 9) < (A[pa] =10) && (B[pb]

测试题目:两个有序数组,找出最大的五个数字组成一个新的数组

注意点: 1.输入两行的方法 2.两行输入的数量和小于5的情况 1 //评测题目: 两个有序数组,找出最大的五个数字组成一个新的数组 2 #include <iostream> 3 #include <vector> 4 #include <cstring> 5 #include <bits/stdc++.h> 6 using namespace std; 7 8 vector<int> getTop5(vector<int>&

两数之和 II - 输入有序数组 --二分查找

题目 给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值(index1 和 index2)不是从零开始的. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素. 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 .因此 index1 =

循环有序数组,查找值

一.从一个循环有序数组总查找给定值 1.思路:先通过中间值和最后一个或者第一个元素比较,找出局部有序范围,再通过二分查找局部有序段 private static int sortArrFindOne(int arr[], int low, int high, int target) { int mid = (high - low) / 2 + low; if (arr[mid] == target) return mid; if (arr[mid] < arr[high]) { if (arr[

有序数组中找中位数

问题描述 给定两个有序数组,返回这两个数组的中位数.如果中位数有两个,则返回它们的平均值. e.g. [1, 3, 5]和[2, 4, 6]的中位数是3.5 解决思路 如果两个数组的长度之和为奇数,则中位数有一个:否则中位数为其中两个的平均值. 从两个数组中找第k个数,可以使用递归的思路. 程序 首先,写出在有序数组a和b中找到第k大的程序: 1. 利用归并排序中的merge数组方法,时间复杂度为O(k). public int findKthNaive(int[] a, int[] b, in

剑指offer中在一个有序数组中找出和为s的两个数字

#include<iostream> using namespace std; bool findnumberwithsum(int A[],int length,int *num1,int *num2,int key) { if(NULL==A||length<=0||NULL==num1||NULL==num2) return false; int start=0; int end=length-1; int sum=0; while(start<end) { *num1=A[

[算法] 循环有序数组查找

有序数组二分查找的变形,代码如下: #include<stdio.h> #include<stdlib.h> int main() { int *array = (int *)malloc(sizeof(int)*16); int i; for(i = 0; i < 16; i++) { *(array + i) = (i+5) % 16; } int ret = search(array, 16, 10); printf("%d", ret); retu

leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值

问题 Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log(m + n)). 分析 本题更经典通用的描述方式时: 给定2个有序数组,找出2个数组中所有元素中第k大的元素. 思路1 直观思

两个有序数组的中位数(第k大的数)

问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路.看网上写了一堆解法,但是将思路说得非常清楚的少之又少. 有两种思路,一个是算法导论里面的,一个是求解k大元素.建议使用下面第二种思路,代码少不容易出错. 下面的内容摘自:https://blog.csdn.net/hackbuteer1/article/details/7584838 求解中位数,算