蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 AA 中,等于 xx 的数字有多少个?
输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。
接下来一行有 nn 个整数 a_ia
i
。
接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。
输出格式
对于每次查询,输出一个整数,表示数组 AA 中有多少个 xx。
数据范围
1 \le n, m \le 10^5, 0 \le x \le 10^61≤n,m≤10
5
,0≤x≤10
6
。
######报错
Time Limit Exceeded
#######
include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
int m;cin>>m;
int* a=(int *)malloc(1000000*sizeof(int));
int* aim=(int *)malloc(1000000*sizeof(int));
int* ans=(int *)malloc(1000000*sizeof(int));
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
{
cin>>aim[i];
getchar();
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(aim[i]==a[j])
ans[i]++;
}
}
for(int i=0;i<m;i++)
cout<<ans[i]<<endl;
}
return 0;
}
输入
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10
结果
0
3
0
1
0
主要是 ans数组你没有初始化为0
int* ans=(int *)malloc(1000000*sizeof(int));
memset(ans,0,1000000*sizeof(int));
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+4;
int nums[MAXN];
int main() {
int n,m;
scanf("%d%d", &n, &m);
for (int i=0; i<n; i++) {
scanf("%d", &nums[i]);
}
//排序
sort(nums, nums+n);
for (int i=0; i<m; i++) {
int x;
scanf("%d", &x);
int lower = lower_bound(nums, nums+n, x)-nums;// 函数用于在指定区域内查找不小于目标值的第一个元素
int upper = upper_bound(nums, nums+n, x)-nums;//用于在指定范围内查找大于目标值的第一个元素
printf("%d\n",upper-lower);
}
return 0;
}
用二分查找可以有效解决
lower_bound(int* ,int* +i, int);