总共N+2行数据。第一行为数字N。接下来N行,每行一个整数。最后一行为数字M。 n<=100000 在上述的N的数据中查找M第一次出现的位置及总共出现的次数。
时间: 2024-06-06 20:08:12 浏览: 91
这道题可以用二分查找来解决,先对输入的N个数进行排序,然后用二分查找找到第一个等于M的数的位置,再从这个位置开始向前和向后遍历,统计出M出现的总次数。
具体实现如下:
1. 读入N和M,以及N个数,存入一个数组中。
2. 对这N个数进行排序,可以使用STL中的sort函数,也可以手写快速排序。
3. 对排序后的数组进行二分查找,找到第一个等于M的数的位置。如果不存在M,则直接输出0。
4. 从这个位置开始向前遍历,统计出M出现的次数,直到找到第一个不等于M的数。
5. 从刚才找到的位置开始向后遍历,统计出M出现的次数,直到找到最后一个等于M的数。
6. 输出M第一次出现的位置和总共出现的次数。
代码实现如下(使用STL中的sort函数):
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000;
int main()
{
int n, m, a[maxn];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
sort(a, a + n); // 对数组进行排序
int l = 0, r = n - 1, first = -1, cnt = 0;
// 二分查找第一个等于M的数的位置
while (l <= r)
{
int mid = (l + r) / 2;
if (a[mid] == m)
{
first = mid;
r = mid - 1;
}
else if (a[mid] < m)
l = mid + 1;
else
r = mid - 1;
}
if (first == -1) // 如果不存在M
{
cout << 0 << endl;
return 0;
}
// 统计M出现的次数
int i = first;
while (i >= 0 && a[i] == m)
{
cnt++;
i--;
}
i = first + 1;
while (i < n && a[i] == m)
{
cnt++;
i++;
}
cout << first << " " << cnt << endl;
return 0;
}
代码实现如下(手写快速排序):
#include <iostream>
using namespace std;
const int maxn = 100000;
void quicksort(int *a, int l, int r)
{
if (l >= r)
return;
int i = l, j = r, x = a[(l + r) / 2];
while (i <= j)
{
while (a[i] < x)
i++;
while (a[j] > x)
j--;
if (i <= j)
{
swap(a[i], a[j]);
i++;
j--;
}
}
quicksort(a, l, j);
quicksort(a, i, r);
}
int main()
{
int n, m, a[maxn];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
cin >> m;
quicksort(a, 0, n - 1); // 对数组进行快速排序
int l = 0, r = n - 1, first = -1, cnt = 0;
// 二分查找第一个等于M的数的位置
while (l <= r)
{
int mid = (l + r) / 2;
if (a[mid] == m)
{
first = mid;
r = mid - 1;
}
else if (a[mid] < m)
l = mid + 1;
else
r = mid - 1;
}
if (first == -1) // 如果不存在M
{
cout << 0 << endl;
return 0;
}
// 统计M出现的次数
int i = first;
while (i >= 0 && a[i] == m)
{
cnt++;
i--;
}
i = first + 1;
while (i < n && a[i] == m)
{
cnt++;
i++;
}
cout << first << " " << cnt << endl;
return 0;
}
阅读全文