简单的二分查找——二分(1)
题目来源:洛谷 P2249【深基13.例1】查找
[原题](P2249 [深基13.例1]查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
共六个测试点。
题解
WA代码1:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n = 0, m = 0;
int a[maxn], b[maxn];
int solve(int x)
{
int ans = lower_bound(a + 0, a + n + 1, x) - a;
if (ans > n)
return -1;
else if (a[ans] != x)
return -1;
else
return a[ans];
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(a + 0, a + n);
int q = 0;
while (m--)
{
scanf("%d", &q);
int ans = solve(q);
if (ans != -1)
{
for (int i = 1; i <= n; ++i)
{
if (ans == b[i])
{
ans = i;
break;
}
}
}
printf("%d", ans);
if (m != 0)
printf(" ");
}
return 0;
}
错误原因分析
未注意到题目中的输入为**非递减数列**。
测试点通过情况
#1,#3,#4,#5 TLE
WA代码2:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n, m;
int a[maxn];
int solve(int x)
{
int ans = lower_bound(a + 0, a + n + 1, x) - a;
if (ans > n || a[ans] != x)
return -1;
else
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
int q;
while (m--)
{
scanf("%d", &q);
int ans = solve(q);
printf("%d", ans);
if (m != 0)
printf(" ");
}
return 0;
}
错误原因分析
数组的输入并非从下标0开始,所以lower_bound()
函数应该从下标1开始。
测试点通过情况
#1 WA
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
const int maxx = 1e5 + 5;
int n, m;
int a[maxn];
int q[maxx];
int solve(int x)
{
int ans = lower_bound(a + 1, a + n + 1, x) - a;
if (ans > n || a[ans] != x)
return -1;
else
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%d", &a[i]);
for (int i = 1; i <= m; ++i)
scanf("%d", &q[i]);
for (int i = 1; i <= m; ++i)
{
int ans = solve(q[i]);
printf("%d", ans);
if (i != m)
printf(" ");
}
return 0;
}