【题目描述】
某次科研调查时得到了n�个自然数,每个数均不超过1500000000(1.5×1091500000000(1.5×109)。己知不相同的数不超过1000010000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
【输入】
包含n+1�+1行:
第11行的整数是n�,表示自然数的个数,第2∼n+12∼�+1行每行一个自然数。
【输出】
包含m�行(m�为n�个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
【输入样例】
8
2
4
2
4
5
100
2
100
【输出样例】
2 3
4 2
5 1
100 2
【提示】
【限制】
40%的数据满足:1≤N≤10001≤N≤1000
80%的数据满足:1≤N≤500001≤�≤50000
100%的数据满足:1≤N≤2000001≤�≤200000,每个数据不超过1500000000(1.5×109)
直接AC代码:
#include <iostream>//ybt该题不能引入<bits/stdc++.h>
using namespace std;
#define N 10005
struct Num
{
int n, c;//n:数字 c:个数
};
Num a[N];
int n, x, ai;//ai:a中元素的个数
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
{
scanf("%d", &x);
int l = 1, r = ai, m = 0;
while(l <= r)
{
m = (l + r) / 2;
if(x < a[m].n)
r = m - 1;
else if(x > a[m].n)
l = m + 1;
else
break;
}
if(m != 0 && a[m].n == x)
a[m].c++;
else
{//把x插入a
a[++ai].n = x;
a[ai].c = 1;
for(int j = ai; j > 1; --j)
{
if(a[j].n < a[j-1].n)
swap(a[j], a[j-1]);
else
break;
}
}
}
for(int i = 1; i <= ai; ++i)
printf("%d %d\n", a[i].n, a[i].c);
return 0;
}
给个点赞吧,QAQ
文章介绍了一个使用C++编写的程序,用于统计一定范围内自然数的出现次数,涉及二分查找和插入排序算法。
590

被折叠的 条评论
为什么被折叠?



