Uva10474

背景

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()函数排序即可。排序之后直接遍历,也可以用二分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值