UVA10474 大理石在哪儿 Where is the Marble?

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;
} 

猜你喜欢

转载自www.cnblogs.com/serendipity-my/p/12641003.html