题解 CF1008C 【Reorder the Array】

这个题目一看就是大的对小的,所以要从大到小排序,因为已经有人用sort了,这里就来一发map+桶排吧!

先来解释一下桶排为什么用map,首先这道题目限时2s,正常桶排是要从1~MAXai,这里ai≤10^9,1s就用掉了,加上两遍n次遍历,2s可能会TLE。

而map有个好处:

map <int, int> mp;
  
mp[1] = 1;
mp[3] = 3;

mp[2]是空的,所以如果使用迭代器遍历输入数据没有的下标就不用花时间遍历了!!!

代码如下:

#include <iostream>
#include <map>
using namespace std;

map <int, int> box, mp;

int main()
{
    int n, a, cur = 0, x = 1, ans = 0;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a;
        mp[a]++;
    }
    for(map <int, int>::reverse_iterator it = mp.rbegin(); it != mp.rend(); ++it)
    {
        int v = it -> first;
        int w = it -> second;
        for(int j = 1; j <= w; j++)
        {
            cur++;
            box[cur] = v;
        }
    }
    for(map <int, int>::iterator it = box.begin(); it != box.end(); ++it)
    {
        if(box[x] > it -> second)
        {
            ans++;
            x++;
        }
    }
    cout << ans << endl;
    return 0;
}

这里说下:

reverse_iterator

因为我们要从大到小排序,桶排迭代器肯定要从rbegin到rend,而map的iterator不支持反向遍历,要用reverse_iterator

posted @ 2020-10-04 10:44  HappyBobb  阅读(15)  评论(0)    收藏  举报  来源