hash的简单应用

版权声明:本文为博主原创文章 https://blog.csdn.net/snowy19130140/article/details/52157238

*1
题目描述: 读入N名学生的成绩,将获得某一给定分数的学生人数输出
输入: 测试输入包含若干测试用例,每个测试用例的格式为:
第1行:N
第2行:N名学生的成绩,相邻两数字用一个空格间隔
第3行:给定分数
当读到N=0时输入结束,其中N不超过1000,成绩分数为(包含)0到100之间的一个整数
输出: 对每个测试用例,将获得给定分数的学生人数输出

#include <iostream>
using namespace std;

int main()
{
    int N;
    int score1;
    int score[101] = { 0 };
    while (cin >> N)
    {
        for (int i = 0; i < N; i++)
        {
            cin >> score1;
            score[score1]++;
        }
        int testscore;
        cin >> testscore;
        cout << score[testscore] << endl;
    }
    system("pause");
    return 0;
}

*
题目描述: 给你n个整数,轻按从大到小的顺序输出其中前m大的数
输入: 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
输出: 对每组测试数据从大到小的顺序输出前m大的数

#include <iostream>
#include <stdio.h>
using namespace std;
int Hash[1000001];                            //Hash首字母要大写
#define OFFECT 500000

int main()
{
//    int OFFECT = 5000;                        //半数据区间
    int n, m;
    while (cin >> n >> m)
    {

        for (int i = 0; i < 2*OFFECT; i++)
            Hash[i] = 0;
//        int hash[10001] = { 0 };            //对读进去的数进行相应的计数
        int *num = new int[n];                //存放前m大的数,其中使用n,主要是因为考虑到一个数可能会出现多次时,后面进行计数使用m可能会出现溢出
        for (int i = 0; i < n; i++)
        {
            int num;
            cin >> num;
            Hash[num + OFFECT]++;            //数据所处的区间为[-5000,5000]
        }
        int no = 0;
        for (int i = 2*OFFECT; i >= 0; i--)
        {
            if (Hash[i] != 0)
            {
                if (no < m)
                {
                    for (int j = no; j < no + Hash[i]; j++)            //注意j的初始值为no,存放在一个数组中
                        num[j] = i - OFFECT;
                    no += Hash[i];            //no计数
                }
                else
                    break;
            }
        }
        for (int i = 0; i < m; i++)
            cout << num[i] << " ";
        cout << endl;
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/snowy19130140/article/details/52157238