思想就是用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;
}


京公网安备 11010502036488号