例题5-1 UVA 10474 Where is the Marble?大理石在哪?

虽然是一个例题,虽然是一道非常简单的题目,但自己还是Wrong answer了一次,还是要写点什么的:

题意非常好理解,看看原文就可以了:

整体思路,按样例格式输入数据后,先排序,在搜索,用到了sort 和 lower_bound函数:

自己主要错在lower_bound上面了:

这个函数是搜索一个数组:找到第一个位置比输入指定数据大或者相等的位置(注意:位置是从0开始的)所以该函数自然和sort 搭配最好了!

所以判断时候,直接看看这个返回值对应的数据是不是等于num即可了!

而不能根据返回值是不是数组长度进行判断,因为数组中可能存在比他大,但不相等的情况!

需要注意的是该函数末尾要减去数组:

例如:

     int b[] = {2,3,4,5};
    printf("%d\n",lower_bound(b ,b + 4, 2)- b);


代码:

#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
    const int maxn = 10000 + 5;
    int cont = 0,N,Q,a[maxn],num;
    while(scanf("%d%d",&N,&Q) == 2 && N){
        printf("CASE# %d:\n",++cont);
        for (int i = 0; i < N; i++)scanf("%d",&a[i]);
        sort(a, a + N);
        while(Q--){
            scanf("%d",&num);
            int p = lower_bound(a, a + N,num) - a;
            if (a[p] != num)printf("%d not found\n",num);
            else printf("%d found at %d\n",num,p + 1);
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值