• 大理石在哪(Where is the Marble?,UVa 10474)


    现有N个大理石,每个大理石上写了一个非负整数。

    首先把各数从小到大排序,然后回答Q个问题。

    每个问题问是否有一个大理石写着某个整数 x (找第一个), 如果是,还有回答哪个大理石上写着 x 。

    排序后的大理石从左到右编号为1~N。

    样例输入:

    4 1

    2 3 5 1

    5

    5 2

    1 3 3 3 1

    2 3 

    样例输出:

    CASE# 1:

    5 found at 4

    CASE# 2:

    2 not found

    3 found at 3

    分析:

    题目意思很清楚了,先排序,再查找。使用 algorithm 头文件中的 sort 和 lower_bound 很容易完成这两项操作。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = 10000;
    
    int main(){
        int n, q, x, a[maxn], kase = 0;
        while(scanf("%d%d",&n,&q)==2 && n)
        {
            printf("CASE# %d:
    ",++kase);
            for(int i=0;i<n;i++) scanf("%d",&a[i]);
            sort(a,a+n);
            while(q--){
                scanf("%d",&x);
                int p = lower_bound(a,a+n,x) - a;//在已排序数组a中寻找x
                printf("%d 
    ",lower_bound(a,a+n,x));
                if(a[p]==x) printf("%d found at %d
    ",x,p+1);
                else printf("%d not found 
    ",x);
            }
        }
        return 0;
    }

    运行效果:

    sort使用数组元素默认的大小比较运算符进行排序,只有在需要安装特殊依据进行排序时才需要传入额外的比较函数

    另外sort可以对任意对象进行排序,不一定是内置类型。如果希望用sort排序,这个类型需要定义小于运算符,或者再排序时传入一个小于函数。

    排序对象可以存在于普通数组里,也可以存在于vector中。

    前者用 sort(a,a+n)的方式调用,后者用 sort(v.begin(), v.end())的方式调用。

    lower_bound的作用是查找 大于或者等于x的第一个位置。

    补充:

    题目地址

  • 相关阅读:
    codevs 3160 最长公共子串(SAM)
    noi2018d2t1
    后缀自动机
    [Scoi2014]方伯伯的玉米田
    【NOI2017】泳池
    【BZOJ2560】串珠子
    POJ 1737 统计有n个顶点的连通图有多少个 (带标号)
    【BZOJ3590】[Snoi2013]Quare 状压DP
    【BZOJ1095】【ZJOI2007】捉迷藏 [动态点分治]
    BZOJ1316: 树上的询问
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14111505.html
Copyright © 2020-2023  润新知