蓝桥杯 小明和完美数列 15分 知识点:哈希

44 阅读1分钟

题目链接: www.lanqiao.cn/problems/31…

我刚开始是这样写的:

#include <iostream>
#include<map>
using namespace std;
const int N = 1e5;
int a[N];
  
int main()
{

    int n = 0; cin >> n;
    map<int, int> m;
    for (int i = 0; i < n; i++)
    {
      int temp=0;
        cin >> temp;
        m[temp]++;
    }

   
   int cnt=0;
    for (auto ch : m)
    {
      int x=ch.first;
      int y=ch.second;
        //cout << ch.first << " "<<ch.second << endl;
       if(x!=y)cnt++;
    }
    cout << cnt<<endl;
    return 0;
}

结果就通过一个样例: image.png

原因是因为我只考虑了这种情况:

1 2 2 3 3 3 13 5

像上面的情况就是实例大于出现次数的情况, 应该删掉13,5.因为他们次数不够,最后变为:

1 2 2 3 3 3 

但是还有一种情况,如下:

1 2 2 3 3 3 3

像这种情况,就是出现次数大于实例本身 的情况。

对于这种情况,我们用出现次数-实例本身解决,4-3=1,所以删掉1个3即可,变为如下:

1 2 3 3 3

code


#include <iostream>
#include<map>
using namespace std;
const int N = 1e5;
int a[N];
  
int main()
{

    int n = 0; cin >> n;
    map<int, int> m;
    for (int i = 0; i < n; i++)
    {
      int temp=0;
        cin >> temp;
        m[temp]++;
    }

   
   int cnt=0;
    for (auto ch : m)
    {
      int x=ch.first;
      int y=ch.second;
        //cout << ch.first << " "<<ch.second << endl;
        if (x<y)
        {
            cnt+=y-x;
        }
        else if(x>y)
        {
          cnt+=y;
        }
   
    }
    cout << cnt<<endl;
    return 0;
}

image.png