ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#83. 美人松的高度2

2022-08-16 22:05:23  阅读:130  来源: 互联网

标签:返回 int 位置 高度 mid 美人松 while ans 83


题目链接:http://oj.tfls.net/p/83

写法一:找到第一个k和最后一个k的位置,区间长度=尾地址-首地址+1;

#include<bits/stdc++.h>
using namespace std;
int ans;
int a[10000010];

//返回第一个p的位置,如不存在p,返回0 
int bs1(int l,int r,int p){
    ans=0;  //答案初始化为0 
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]>=p){   //满足条件,区间向左侧缩 
            if(a[mid]==p) ans=mid;   //相等时才记录答案 
            r=mid-1;
        }
        else
            l=mid+1;
    }
    return ans;
}

//返回最后一个p的位置,如不存在p,返回0 
int bs2(int l,int r,int p){
    ans=0;  //答案初始化为0 
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]<=p){  //满足条件,区间向右侧缩 
            if(a[mid]==p) ans=mid;  //相等时才记录答案 
            l=mid+1;
        }
        else
            r=mid-1;
    }
    return ans;//返回值为-1表示数列中所有数都>P
}

int main(){
    int n,m,k;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=m;i++){
        cin>>k;
        if(bs1(1,n,k))  //返回值为真,k存在 
            cout<<bs2(1,n,k)-bs1(1,n,k)+1<<" ";
        else cout<<0<<" ";
    }
    return 0;
}

写法二:找到第一个k和最后一个k的位置,区间长度=尾地址-首地址+1;

#include<bits/stdc++.h>
using namespace std;
int ans;
int a[10000010];

//返回第一个p的位置,如不存在p,返回0  
int bs1(int l,int r,int p){
    ans=0;  //答案初始化为0 
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]>=p){
            ans=mid;
            r=mid-1;
        }
        else
            l=mid+1;
    }
    if(a[ans]!=p) ans=0;  //判断答案是否为p 
    return ans;
}

//返回第一个p的位置,如不存在p,返回0 
int bs2(int l,int r,int p){
    ans=0;  //答案初始化为0 
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]<=p){
            ans=mid;
            l=mid+1;
        }
        else
            r=mid-1;
    }
    if(a[ans]!=p) ans=0;  //判断答案是否为p 
    return ans;
}

int main(){
    int n,m,k;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=m;i++){
        cin>>k;
        if(bs1(1,n,k))   //返回值为真,k存在 
            cout<<bs2(1,n,k)-bs1(1,n,k)+1<<" ";
        else cout<<0<<" ";
    }
    return 0;
}

写法三:二分查找,找到k的位置,从找到的位置分别向前、向后搜索

ps:代码来自王嘉宇同学

#include<bits/stdc++.h>
using namespace std;
int a[10000005];
int main() {
    int n,m,sum=0,k;
    cin>>n>>m;
    int l=1,r=n;
    int ans=0;
    for(int i=1; i<=n; i++) {
        cin>>a[i];
    }
    for(int j=1; j<=m; j++) {
        cin>>k;
        l=1;  r=n;   sum=0;  //初始化左边界、右边界、答案 
        
        //二分查找,找到k的位置 
        while(l<=r) {
            int mid=(l+r)/2;
            if(a[mid]==k) {
                ans=mid;
                break;
            } else if(a[mid]>k) {
                r=mid-1;
            } else
                l=mid+1;
        }
        if(a[ans]==k) {  //k存在
            //从找到的位置向后搜索,不等于k时跳出循环 
            for(int w=ans; w<=n; w++) {
                if(a[w]==k) {
                    sum++;
                } else {
                    break;
                }
            }
            //从找到的位置向前搜索,不等于k时跳出循环 
            for(int v=ans; v>=1; v--) {
                if(a[v]==k) {
                    sum++;
                } else {
                    break;
                }
            }
            sum-=1;
        }
        cout<<sum<<" ";
    }
    return 0;
}

 

标签:返回,int,位置,高度,mid,美人松,while,ans,83
来源: https://www.cnblogs.com/tflszxl/p/16593127.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有