问题标题: 大佬求救!!!

0
0
已解决
桑烁
桑烁
高级光能
高级光能

Time Limit Exceeded:80分

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int a1[n],a2[m],p[m];
    for(int i=0;i<n;i++)
    cin>>a1[i];
    for(int i=0;i<m;i++)
    cin>>a2[i];
    for(int i=0;i<m;i++)
    {
        int x=0;
        for(int j=0;j<n;j++)
        {
            if(a1[j]<=a2[i])
            x=a1[j];
            else
            j=n;
        }
        if(x==0)
        p[i]=-1;
        else
        p[i]=x;
    }
    for(int i=0;i<m;i++)
    cout<<p[i]<<endl;
} 

不要发自己的代码,大家教下我错在哪里或者怎么改

桑烁在2018-10-13 12:01:20追加了内容

本人不会二分,要代码注释

桑烁在2018-10-20 15:05:47追加了内容

大佬们救救我啊

桑烁在2018-11-03 13:56:45追加了内容

1


0
已采纳
张元宝
张元宝
修练者
修练者

额,这是二分查找吧......

我之前和你一样,后来交了N次才知道是二分查找,然后AC了

l代表left
r代表right
m代表mid
定义一个函数:    
int found(int l, int r, int x) {
    int m;
    while(l <= r) {
        m = (l + r) / 2;
       // 因为a数组是一个"单调增的正整数序列",所以a[m]大了往右找,小了往左找
         
        如果a[m]==查找的x,
            return a[m];
            
        如果a[m]>查找的x,
            r=m-1;
            
        如果a[m]<查找的x,
            l=m+1;
    }
    return a[r];
}
主函数:
在输入时 found(1,n,x);

 

张元宝在2018-10-21 19:33:57追加了内容
int find(int left, int right, int x) {
    int mid;
    while(left <= right) {
        mid = (left + right) / 2;
        if(a[mid] == x)
            return a[mid];
        else if(a[mid] < x)
            left = mid + 1;
        else right = mid - 1;
    }
    return a[right];
}
张元宝在2018-10-21 19:39:57追加了内容

a数组为全局变量。

主函数{

定义 n, m, x, i;
    while(scanf("%d%d", &n, &m) != EOF) { //EOF是结束符
        a[0] = -1;
        for(i=1; i<=n; i++) 
       输入a[i]
        for(i=1; i<=m; i++) {
            输入
            printf("%d\n", find(1, n, x));
        }
    }

}

0
0
赵逸凡
赵逸凡
初级启示者
初级启示者

分而冶之

定义指针left,right

0
丁振轩
丁振轩
资深光能
资深光能

超时了。。。。。。。。。。。。。。。。。。。。。

0
我要回答