0分玄关

P2249 【深基13.例1】查找

lijiayu_spyz @ 2023-10-10 22:03:36

最后一个答案输出不了,所以点TLE 代码:

#include<bits/stdc++.h>
using namespace std;
long long n,m,sum,z,a[1000001];
int findanswer(int s){
    int l=1,r=n;
    while(l<r){
        int mid=l+(r-1)/2;
        if(a[mid]>=s) r=mid-1;
        else l=mid+1;
    }
    if(a[l]==s) return l;
    else cout<<"-1";
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>z;
        int l=1,r=n;
        while(l<r){
            int mid=l+(r-1)/2;
            if(a[mid]>=z) r=mid-1;
            else l=mid+1;
        }
        if(a[l]==z) cout<<l<<" ";
        else cout<<"-1";
    }
    return 0;
} 

求求大佬救救我


by IceKylin @ 2023-10-10 22:07:30

@lijiayu_spyz

输出 -1 后也要加空格


by Silent_Ltcd_2024 @ 2023-10-10 22:33:31

@lijiayu_spyz

挺多问题的。

一是负一后面要加空格。

二是最好二分使用标准模板,你这个会超时。

正确的:

while(l<=r) {
      int mid=(l+r)/2;
      if(...) l=mid-1;
      else r=mid+1;
}

AC code:

#include<bits/stdc++.h>
using namespace std;
long long n,m,sum,z,a[1000001];
int findanswer(int s){
    int l=1,r=n;
    while(l<=r){
        int mid=(l+r)/2;
        if(a[mid]>=s) r=mid-1;
        else l=mid+1;
    }
    if(a[l]==s) return l;
    else cout<<"-1";
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=m;i++){
        cin>>z;
        int l=1,r=n;
        while(l<=r){
            int mid=(l+r)/2;
            if(a[mid]>=z) r=mid-1;
            else l=mid+1;
        }
        if(a[l]==z) cout<<l<<" ";
        else cout<<"-1 ";
    }
    return 0;
} 

by Silent_Ltcd_2024 @ 2023-10-10 22:34:14

关注 @CSP_AK_zyz 谢谢喵。


by lijiayu_spyz @ 2023-10-10 22:39:19

@CSP_AK_zyz 感谢!


by lijiayu_spyz @ 2023-10-11 21:09:52

此贴完结


|