C++ --- UVa10474. Where is the Marble? 解题报告

本博文源于《算法竞赛入门经典(第二版)》,旨在解决大理石在哪儿(Where is the Marble? Uva10474)这道题目,渐渐走入题库训练。博文目录有:1.问题再现2.样例输入&样例输出3.题目分析4. 代码测试效果5.代码讲解及完整源码

1.问题再现

现有N个大理石,每个大理石上写了一个非负整数。首先把各数从小到大排序,然后回答Q个问题。每个问题是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石写着x。排序后的大理石从左到右编写为1-N。(样例中,所有大理石上的数合并到一行,所有问题也合并到一行)

2.样例输入&样例输出

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

3.题目分析

  • 题目上说“首先把各数从小到大排序” ,也就是你要先排序
  • “每个问题是否有一个大理石写着某个整数x”这句话的意思就是要去查找这个数字
  • 如果是,还要回答哪个大理石写着x 这句话的意思是,排序好后,然后进行查找,查找完,如果找到那就返回这个值的下标

例如 输入 4 1也就是输入四个数字 去问1个问题
2 3 5 1
5
输入2 3 5 1这四个数字,问5在这个石头里吗?
先排序
1 2 3 5
结果发现5在第四个,那就是说5找到了,在第四个,输出就是样例输出.

4. 代码测试效果

在这里插入图片描述

5.代码讲解及完整源码

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10000;

int main()
{
    
    
	int n,q,x,a[maxn],kase = 0;//n:输入的数组个数 q:问题个数 x:要查找的值,maxn:数组的全部容量,kase:样例计数
	while(scanf("%d%d",&n,&q) == 2 && n){
    
     //输入
		printf("CASE# %d:\n",++kase); //样例加1
		for(int i=0;i<n;i++) //输入数字
			scanf("%d",&a[i]);
		sort(a,a+n);//用c++函数进行排序
		while(q--) {
    
     //问题中每一个数字开始在数组中进行查找
			scanf("%d",&x); //输入你要查找的数字
			int p = lower_bound(a,a+n,x)-a;//在已排序数组a中寻找x
			if(a[p] == x) //找到的话怎样,找不到又怎样,开始输出
				printf("%d found at %d\n",x,p+1);
			else
				printf("%d not found\n",x);
		}
		
	}
	
	return 0;
}

Guess you like

Origin blog.csdn.net/m0_37149062/article/details/121351734