二分

★实验任务
从前有个富商,他拥有 N 件珠宝,每件珠宝都有一个价格。每次有人想向他买价格为
X 的珠宝时,富商都要去数自己总共有多少件该价值的珠宝。因为富商有很多很多的珠宝,
所以他觉得这样做很烦,希望你编个小程序来帮助他。
★数据输入
第一行输入两个正整数 N QN Q<=500000)。
接下来一行输入 N 个正整数,空格隔开,代表珠宝的价格。
接下来一行输入 Q 个正整数,空格隔开,代表 X
★数据输出
对于每个 X,输出一行代表富商拥有价格为 X 的珠宝的数量。

输入示例      输出示例

5 3              0
3 4 9 6 4        1
1 9 4            2

#include<iostream>    
#include<algorithm>    
using namespace std;    
int a[500000],b[500000];    
int main()    
{    
    int n,q,c,k=0,left,right,m;    
    int i;    
    scanf("%d %d",&n,&q);    
    for(i=0;i<n;i++)    
        scanf("%d",a+i);    
    sort(a,a+n);    
    i=0;    
    while(k<n)    
    {    
        for(c=1;k+1<n&&a[k]==a[k+1];c++,k++);    
            b[i]=c;    
            a[i++]=a[k++];    
    }    
    n=i;    
    while(q--)    
    {    
        scanf("%d",&i);    
        left=0;    
        right=n;    
        while(left<right)    
        {    
            m=(left+right)>>1;    
            if(i<a[m])    
                right=m;    
            else if(i>a[m])    
                left=m+1;    
            else    
                break;    
        }    
        if(left<right)    
            printf("%d\n",b[m]);    
        else    
            printf("0\n");    
    }    
    return 0;    
}  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值