[二分]1159: 查找元素

1159: 查找元素

Description
给定一个集合,询问一个元素是否存在。
Input
第一行两个数n和m,表示集合的大小和询问的次数。(1 ≤ m ≤ n ≤ 100000)
第二行n个数,表示集合的元素。(1 ≤  Ai ≤ 87654321)
第3行到m+2行,每行一个数,表示要询问的元素。
Output
m行,每行表示每一次询问的结果。
对于每次询问,输出元素的位置,不存在的话输出-1。(数据保证无重复元素)

Sample Input
3 3
3 1 2
2
4
1
Sample Output
3
-1
2
 

 

没啥好说的,二分查找。。。之前打算不用算法直接过的,还是妄想了。。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int x;
struct node
{
    int pos;
    int num;
};
node s[100010];
bool cmp(node a, node b)
{
        return a.num<b.num;
}
int binary_search(int left,int right,int key)
{
    while(left<=right)
    {

        int mid=(left+right)/2;
      //  printf("left=%d mid=%d right=%d key=%d s[%d].num=%d\n",
      //  left,mid,right,key,mid,s[mid].num);
        if(key==s[mid].num)
            { return mid; }
        else if(key<s[mid].num)
            { right=mid-1; }
        else if(key>s[mid].num)
            { left=mid+1;}
    }
    return 0;
}
int main()
{
    int n,m,i;
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        scanf("%d",&s[i].num);
        s[i].pos=i;
    }
    sort(s+1,s+1+n,cmp);
    while(m--)
    {
        scanf("%d",&x);
        int a=binary_search(1,n,x);
        if(a)  cout<<s[a].pos<<endl;
        else cout<<"-1"<<endl;
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值