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

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

UVA10474 大理石在哪儿 Where is the Marble?
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;
} 
上一篇:C - 4 Values whose Sum is 0 POJ - 2785 (折半枚举)(二分搜索)


下一篇:挑战程序设计竞赛3.2习题:Bound Found POJ - 2566