保龄球二分

题目要求找到对应的值,数据范围在10^5内,因此不能循环枚举每一个值判断。

那么就需要一个高效的算法,根据所求在数组内查找相同值,可以使用stl库里的set查询,也可以二分

二分的话要把数据排序,但要对应输出未排序的下标,所以需要用struct来储存一个mark为未排序的下标

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> 
using namespace std;
int n; int k=0;
struct node{
    int mark,ball;
}a[100001];
int cmp(node x,node y)
{
    return x.ball<y.ball;
}
int erfen(int l,int r)
{
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(k>a[mid].ball) l=mid+1;
        else r=mid-1;
    }
    if(a[l].ball==k) cout<<a[l].mark<<endl;
    else cout<<"0"<<endl;
}
int main()
{
    cin>>n;    
    for(int i=1;i<=n;++i)
    {
        cin>>a[i].ball;
        a[i].mark=i;
    }
    sort(a+1,a+n+1,cmp);
    int q;cin>>q;
    for(int i=1;i<=q;++i)
    {    
        k=0;
        cin>>k;
        erfen(1,n);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值