背景
Raju和Meena喜欢和大理石玩。他们有许多表面写了数字的大理石。一开始,Raju会按数字的大小升序一个接一个地放置大理石。之后,Meena会让Raju去找写着某一确定数字的第一枚大理石。她会计数:1,2,3…回答正确Raju的一分,否则Meena得一分。在一些固定的次数尝试之后,游戏结束并且最高的分的人获胜。今天你有一个机会扮演Raju。作为一个聪明的小孩,你将有计算机的帮助。但是,别小瞧Meena!她已经写了一个记录你回答所有问题的次数的程序。所以你现在也不得不写一个程序,这个程序将帮助你扮演的Raju。
输入
可能会有多组测试。所有的测试样例少于65。每个例子由2个整数开始:N代表大理石的数量,Q代表Meena问问题的次数。接下来的N行包含写在N枚大理石上的数字。这些数字不会以特别的序列出现。接下来Q行将有Q个问题。能确定的是:输入的数字不会超过10,000并且这些数字都是非负数。
输出
对应每一个测试样例,输出连续的数字。对应每一个问题,打印一行。这一行的格式将取决于被问的某数字是否写在了任意一个大理石上。这两种不同的格式描述如下:
‘x found at y’,如果第一个写着数字x的大理石在位置y被发现。位置被编号为:1,2,…N。
‘x not found’,如果找不到写着数字x的大理石。
思路
第一步排序;第二步查找。一开始想着排序之后就用二分查找找到就OK,能很快找到写着x数字的大理石,但是别忘了题目中的条件,第一个写着数字的x在位置y被发现!所以要么排序之后直接遍历查找,或者二分找到x之后继续向左线性查找直到发现第一个x。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char **argv)
{
int N, Q;
int sampleCount = 0;
while (cin >> N >> Q)
{
// 大理石数量和问题都为0时退出
if (0 == N && 0 == Q)
break;
// 读入大理石信息
vector<int> vecMarbles;
for (int i = 0; i < N; i++)
{
int number;
cin >> number;
vecMarbles.push_back(number);
}
// 排序大理石
sort(vecMarbles.begin(), vecMarbles.end());
// 读入问题
cout << "CASE# " << ++sampleCount << ":" << endl;
for (int i = 0; i < Q; i++)
{
int question;
cin >> question;
bool finded = false;
vector<int>::iterator it = vecMarbles.begin();
for ( ; it != vecMarbles.end(); ++it)
{
if (*it == question)
{
finded = true;
break;
}
}
if (finded)
cout << question << " found at " << it - vecMarbles.begin() + 1 << endl;
else
cout <<question << " not found" << endl;
}
}
return 0;
}
因为int有<比较符,所以直接用sort()函数排序即可。排序之后直接遍历,也可以用二分。