• 一本通1115:直方图


    题目传送门

    【题目描述】

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

    假设 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

    分析:

    这个题的主要思路是先找出最大值,**用一个辅助的cnt[]数组统计出每个数字在他相应的位置出现了几次,这里的关键代码为:

    cnt[f[i]]++;
    

    f[i]表示这n个元素,1就在他在cnt[]数组里对应的cnt[1]++,5就在cnt[5]++,以此类推。
    然后我们直接输出cnt[]1~max值里面的数值就可以了

    注意,这个题因为要统计0的次数,所以循环条件一定从0开始,而最后输出的时候max值的次数也要输出,所以边界为i<=maxn

    Code:

    #include<iostream>
    #include<cstdio>
    #define N 10010
    #define rg register
    #define ll long long
    using namespace std;
    int n;
    int f[N];
    inline void read(int &x){
    	int f=1;
    	char ch=getchar();
    	x=0;
    	while(ch<'0'||ch>'9'){
    		if(ch=='-') f=-1;
    		ch=getchar();
    	}
    	while(ch>='0'&&ch<='9'){
    		x=x*10+ch-'0';
    		ch=getchar();
    	}
    	x*=f;
    }
    int maxn=0xc0c0c0c0;
    int cnt[N];
    int main(){
    	read(n);
    	for(rg int i=0;i<n;i++){
    		read(f[i]);
    		if(f[i]>maxn) maxn=f[i];
    	}
    	for(rg int i=0;i<n;i++){
    		cnt[f[i]]++;
    	}
    	for(rg int i=0;i<=maxn;i++) printf("%d
    ",cnt[i]);
    	return 0;
    }
    
    本文欢迎转载,转载时请注明本文链接
  • 相关阅读:
    Oracle 中 varchar2(N) 与 varchar2(N char) 的区别
    EXP-00008: 遇到 ORACLE 错误 1455
    服务器重装Windows Server2008 R2操作系统
    h5页面自定义主题色(vue)
    初窥vue3.0
    ElasticSearch学习笔记_1
    mysql索引的使用
    什么时候使用视图
    Latex使用手册记录
    最大熵模型理论及NLP应用总结
  • 原文地址:https://www.cnblogs.com/-pwl/p/13159429.html
Copyright © 2020-2023  润新知