高级光能
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
修练者
额,这是二分查找吧......
我之前和你一样,后来交了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));
}
}
}