当前位置:首页 > 题解目录 > 正文内容

【题解】直方图

亿万年的星光5年前 (2021-05-01)题解目录4806

直方图(histogram.cpp)

【题目描述】

给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里面最大的数。

假设Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2...Fmax}里每个数出现的次数。

【输入描述】

第一行n个数组的大小,1<=n<=10000

紧接着一行是数组的n个元素。

【输出描述】

按顺序输出每个数的出现次数,一行一个数。如果没有出现,则输出0。对于例子中的数组,最大的数是3,因此我们只统计{0,1,2,3}的出现频数。

【样例输入】

5
1 1 2 3 1


【样例输出】

0
3
1
1


【题目分析】

  • 非常经典的桶排使用方法,a[x]++操作就能完成排序工作

  • 统计只到max每个数出现的次数,只需要我们在计算过程中把最大数统计出来即可。



【参考代码1】

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[10001];//定义数组
    int  Fmax=-1;//定义最大的数
    for(int i=0; i<n; i++)
    {
        cin>>a[i];
        if(Fmax<=a[i])
            Fmax=a[i];//找出最大的数
    }
    int b[10001];//声明计数数组
    memset(b,0, sizeof(b));//初始化数组
    for(int i=0; i<n; i++)
    {
        b[a[i]]++;//统计出现的次数
    }
    for(int i=0; i<=Fmax; i++)
    {
        cout<<b[i]<<endl;
    }

    return 0;
}


【参考代码2】

#include<iostream>
using namespace std; 
int main() 
{
    int n,x;
    int a[10001]={0};
    int max=-9999,flag;
    int i;
    
    /*桶排的思想*/
    
    cin>>n;//输入数组大小n
    for(i=1;i<=n;i++)
    {
        cin>>x;//输入元素
    	a[x]++;
        if(x>max)
            max=x;//记录最大值
    }
    for(i=0;i<=max;i++)//输出到max为止的频数
    	cout<<a[i]<<endl;
    
    return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

标签: 模拟桶排
分享给朋友:

相关文章

【题解】最小新整数

4.最小新整数(smallest.cpp)【题目描述】假如:有一个十进制正整数n,每个数位上数字均不为0,并且0<n<1000000000。n的位数为m。先在从m位中删除k位(0<k...

【题解】区间合并

【题目描述】给定n个闭区间[ai,bi],其中i=1,2,...n。任意两个相邻或相交或相邻的闭区间可以合并为一个闭区间。例如,[1,2]和[2,3]可以合并为[1,3]。[1,3]和[2,4]可以合...

【题解】数字三角问题

【题解】数字三角问题

【题目描述】给字一个由n行数字组成的数字三角形(等腰三角形)。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。【输入描述】数字三角形的行数和数字三角形【输出描述】最大的路...

【题解】线段

【题目描述】在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?【输入描述】第一行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。【输出描述】输出...

【题解】修改回文

【题目描述】如果一个字符串,顺读与倒读的内容一样,称这个字符串为回文。例如 aka 是一个回文,noon 也是一个回文。给定一个字符串,请计算最少需要修改多少个字符,才能...

【题解】核电站问题

【题目描述】一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续3个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。现在,请你计算:对于给定的N,求不发生爆炸的放置核物质的方案总数...