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