UVA10474 大理石在哪儿 Where is the Marble?
题意翻译
现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回 答Q个问题。每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上 写着x。排序后的大理石从左到右编号为1~N。
输入输出样例:
//输入
4 1 4个大理石 1个问题
2 2 3 5 1 大理石上写的数字
3
5
1
5 这个5是问题 是否有一个大理石写着5
5 2
1
3
3
3
1
2
3
0 0
//输出
CASE# 1:
5 found at 4 注意一定要先排序再判断是第几个 2351 => 1 2 3 5 所以第四个
CASE# 2:
2 not found
3 found at 3
所以本题关键就是排序加判断x是第几个
题目意思已经很清楚了:先排序,再查找。使用algorithm头文件中的sort和lower_bound 很容易完成这两项操作
对于查找
binary_search():顾名思义,二分查找,不过这个函数有个很TD的问题,它的返回值是bool类型的,且前提是有序的容器。
下面是它的描述:“binary_search试图在已排序的[first, last)中寻找元素value。如果[first, last)内有等价于value的元素,它会返回true,否则返回false,它不返回查找位置”
lower_bound():
“lower_bound()它试图在已排序的[first,last)中寻找元素value。如果[first, last)具有等价于value的元素,lower_bound返回一个iterator指向其中第一个元素。如果没有这样的元素存在,它便返回假设这样的元素存在的话,会出现的位置”
人话便是:“指向第一个不小于value的元素。如果value大于[first, last)的任何一个元素,则返回last”
举个例子 :1 2 3 5 问4在不在里面,用lower_bound 返回的是第一个不小于4的位置的指针 所以要判断还需要判断a[p]==x
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=10000;
using namespace std;
int main()
{
int n,q;
int x;
int a[maxn];
int kase=0;
while(cin>>n>>q&&n)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n); //排序
while(q--)
{
cin>>x; //要问的那个整数
int p=lower_bound(a,a+n,x)-a; //记录位置,注意:这个函数(对于数组)返回的是那个数的指针,你要减掉数组的指针,才能得到int,(指针相减)
cout<<(++kase)<<"# :";
if(a[p]==x) printf("%d found at %d\n", x, p+1); //判断
else printf("%d not found\n", x);
}
}
return 0;
}