思想就是用map记录每个相同数字num的次数count;
1、count<=num+1,则该num对应的人数为num+1;
2、count>num,则进行num+1,count -= num;之后再进行判断,因为每一个num对应的人数最多为num+1,所以要减去num重新判断。
即比如2 2 2 2;这四个2是不同阵容的,比如前面两个2代表蓝色,则后面的两个2就应该是红色或者其他不适蓝色的颜色。属于两个阵容,人数为(3+1) + (3+1);

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
    map<int, int>mp;
    int num;
    while(cin>>num) {
        if(mp.find(num) == mp.end()) {//没有则建立字典
            mp.insert(make_pair(num, 1));
        }
        else
            mp.find(num)->second += 1;
    }
    int res = 0;
    for(map<int,int>::iterator i=mp.begin(); i!=mp.end(); ) {
        if(i->first == 0) {//0代表均不同,则键对应的值就是人数
            res += i->second;
            ++i;
        }
        else {//每个键对应的人数最多为key+1,所以需要判断。
            res += i->first+1;
            if(i->second <= i->first+1) ++i;
            else i->second -= i->first;
        }
    }
    cout<< res << endl;
}