本博文源于《算法竞赛入门经典(第二版)》,旨在解决大理石在哪儿(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;
}