小明和完美序列——map

小明和完美序列——map_第1张图片

由完美序列的定义可以知道,序列中每个数字的个数,要么是等于它本身,要么就是一个没有。

如果一个数字出现的次数比它本身大,我们就选择删掉多出的,

这样肯定比完全删除是更优的,只有在当一个数字出现的次数小于它本身的时候,这种情况,我们不得不选择全部删除。

所以解决这个问题,只要统计每个数字出现的次数就可以了。由于数字的范围最大有 10^9 ,所以我们用一个 map 统计

 

#include 
using namespace std;
typedef long long LL;//由于数字的范围最大有 10^9

signed main()
{
    int n; cin >> n;
    vector a(n + 1);//定义vector数组, 容量为n+1
    map cnt;
    //输入
    for(int i = 1; i <= n; i ++) {
        cin >> a[i];
        cnt[a[i]] ++;
    }
    int ans = 0;
    for(auto [x, y] : cnt)
   {
      //出现的次数>数字本身,删除掉多余的,直到等于数字本身为止.
        if(y > x) ans += y - x;//算出要删除的次数,删除y-x次
      else if(y < x) ans += y;//如果比数字小,则全删除,删除y次
    }
    cout << ans;
}

你可能感兴趣的:(算法,c++,数据结构)