输入n个不超过10的九次方的单调不减的(就是后面的数字不小于前面的数字)的非负整数
a1,2,..an,然后进行m.次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出-1。
输入格式
第一行2个整数n和m,表示数字个数和询问次数。
第二行n个整数,表示这些待查询的数字。
第三行m个整数,表示询问这些数字的编号,从1开始编号。
输出格式
输出一行,m个整数,以空格隔开,表示答案。
#include
int a[1000000],b[1000000];
int main(){
int m,n,ans=-1,i,mid;
scanf("%d%d",&n,&m);
getchar();
for(i=0;iscanf("%d",&a[i]);
i=0;
while(m-->=0){
scanf("%d",&b[i]);i++;
int l=0,r=n-1;
while(l<=r){
int mid=(l+r)/2;
if(b[i-1]<=a[mid]){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
if(ans!=-1)printf("%d ",ans);
}
return 0;
}
哪里错了
如输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6应输出1 2 -1
但是却不是
目测你把查找和输入放在一个循环里了,数据还没有输入呢,自然找不到
写得不好,仅供参考!
#include<stdio.h>
int *binarySearch(int val, int *a, int n)
{
int m = n / 2;
if (n <= 0)
return NULL;
if (val == a[m])
return a + m;
if (val < a[m])
return binarySearch(val, a, m);
else
return binarySearch(val, a + m + 1, n - m - 1);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int a[n];
int b[m];
int c[m];
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < m; i++)
scanf("%d", &b[i]);
for (int i = 0; i < m; i++)
{
int *t = binarySearch(b[i], a, n);
for (int j = 0; j < n && t; j++)
{
if (*t == a[j])
{
c[i] =1+ j;
break;
}
}
if (!t)
c[i] = -1;
}
for (int i = 0; i < m; i++)
{
if (i == m - 1)
printf("%d\n", c[i]);
else
printf("%d ", c[i]);
}
return 0;
}
以下是不用二分法查找的写法
#include<stdio.h>
/* 既然数据都是有序递增的了 下面这样反而精简多
二分法简直就是多取一举 除非数据不能重复 */
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int a[n];
int b[m];
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < m; i++)
scanf("%d", &b[i]);
for (int i = 0; i < m; i++)
{
int j;
for (j = 0; j < n; j++)
{
if (b[i] == a[j])
{
i == m - 1 ? printf("%d\n", j + 1) : printf("%d ", j + 1);
break;
}
}
if (j == n)
i == m - 1 ? printf("%d\n", -1) : printf("%d ", -1);
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: