zoukankan      html  css  js  c++  java
  • 一本通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;
    }
    
    本文欢迎转载,转载时请注明本文链接
  • 相关阅读:
    04.安全-TLS1.2连接过程
    02.安全-证书和CA
    01.安全-加密
    00.https基本
    00.二叉树基本
    二分查找01.基本二本查找及其变种
    01.数据结构资料,时间复杂度空间复杂度(数据结构算法基本)
    从 CentOS 8 平滑迁移至 CentOS Stream
    identityserver使用记录
    vs2019 使用私钥进行连接时出错 ssh连接报错
  • 原文地址:https://www.cnblogs.com/-pwl/p/13159429.html
Copyright © 2011-2022 走看看