九度笔记之 1349:数字在排序数组中出现的次数

来源:互联网 发布:php序列化和反序列化 编辑:程序博客网 时间:2024/04/19 08:49

题目1349:数字在排序数组中出现的次数

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:919

解决:230

题目描述:
统计一个数字在排序数组中出现的次数。
输入:

每个测试案例包括两行:

第一行有1个整数n,表示数组的大小。1<=n <= 10^6。

第二行有n个整数,表示数组元素,每个元素均为int。

第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。

下面有m行,每行有一个整数k,表示要查询的数。

输出:
对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。

样例输入:
81 2 3 3 3 3 4 513
样例输出:
4

算法分析

      利用二分查找,分别查找某个数字在数组中第一次出现的位置和最后一次出现的位置。

       

源程序

        输入输入还是要用 scanf,printf 
        同时要考虑数组只有一个数的情况
       但是还有一个通不过,不知道为什么
//============================================================================// Name        : judo1349.cpp// Author      : wdy// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================//bisearch#include <iostream>#include <stdio.h>using namespace std;int num[1000001] = {0};void init(int n){    for(int i = 0;i<n;i++)        scanf("%d",num+i);;}int findL(int b,int e,int value){    if(b==e && value == num[0])        return 1;    if(b==e && value != num[0])        return -1;    int bid = b;    int eid = e;    int mid = bid + ((eid-bid)>>1);    while(bid<eid-1){        mid = bid + ((eid-bid)>>1);        if(num[mid]>= value)            eid = mid;        else            bid = mid;    }     if(num[bid]==value)        return bid;    else if(num[eid]==value)        return eid;    else        return -1;//not found}int findR(int b,int e,int value){     if(b==e && value == num[0])        return 1;    if(b==e && value != num[0])        return -1;     int bid = b;    int eid = e;    int mid = bid + ((eid-bid)>>1);    while(bid<eid-1){        mid = bid + ((eid-bid)>>1);        if(num[mid]<= value)            bid = mid;        else            eid = mid;    }     if(num[eid]==value)        return eid;    else if(num[bid]==value)        return bid;    else        return -1;// not found}void test(){    num[0] = 1;    num[1] = 1;    num[2] = 1;    num[3] = 3;    num[4] = 3;     std::cout<<"L"<<findL(3,4,4)<<std::endl;    std::cout<<"R"<<findR(3,4,4)<<std::endl;} void findValue(int b,int e,int value){    std::cout<<findR(b,e,value)-findL(b,e,value)+1<<std::endl;}void judo(){    int n;    int m;    int value;    while(scanf("%d",&n) != EOF){        init(n);        scanf("%d",&m);        while(m>0){            scanf("%d",&value);            findValue(0,n-1,value);            m--;        }    }}int main() {    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!    judo();    return 0;} /**************************************************************    Problem: 1349    User: KES    Language: C++    Result: Wrong Answer****************************************************************/


找到问题了,要考虑找不到的返回0

//============================================================================// Name        : judo1349.cpp// Author      : wdy// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================//bisearch#include <iostream>#include <stdio.h>using namespace std;int num[1000001] = {0};void init(int n){    for(int i = 0;i<n;i++)        scanf("%d",num+i);;}int findL(int b,int e,int value){    if(b==e && value == num[0])        return 1;    if(b==e && value != num[0])        return -1;    int bid = b;    int eid = e;    int mid = bid + ((eid-bid)>>1);    while(bid<eid-1){        mid = bid + ((eid-bid)>>1);        if(num[mid]>= value)            eid = mid;        else            bid = mid;    }     if(num[bid]==value)        return bid;    else if(num[eid]==value)        return eid;    else        return -1;//not found}int findR(int b,int e,int value){     if(b==e && value == num[0])        return 1;    if(b==e && value != num[0])        return -1;     int bid = b;    int eid = e;    int mid = bid + ((eid-bid)>>1);    while(bid<eid-1){        mid = bid + ((eid-bid)>>1);        if(num[mid]<= value)            bid = mid;        else            eid = mid;    }     if(num[eid]==value)        return eid;    else if(num[bid]==value)        return bid;    else        return -1;// not found}void test(){    num[0] = 1;    num[1] = 1;    num[2] = 1;    num[3] = 3;    num[4] = 3;     std::cout<<"L"<<findL(3,4,4)<<std::endl;    std::cout<<"R"<<findR(3,4,4)<<std::endl;} void findValue(int b,int e,int value){       int R = findR(b,e,value);       int L = findL(b,e,value);       if( R>0)          std::cout<<R-L+1<<std::endl;        else              std::cout<<0<<std::endl;}void judo(){    int n;    int m;    int value;    while(scanf("%d",&n) != EOF){        init(n);        scanf("%d",&m);        while(m>0){            scanf("%d",&value);            findValue(0,n-1,value);            m--;        }    }}int main() {    //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!    judo();    return 0;}/**************************************************************    Problem: 1349    User: KES    Language: C++    Result: Wrong Answer****************************************************************/


结果


原创粉丝点击