781. Rabbits in Forest

In a forest, each rabbit has some color. Some subset of rabbits (possibly all of them) tell you how many other rabbits have the same color as them. Those answers are placed in an array.

Return the minimum number of rabbits that could be in the forest.

Examples:
Input: answers = [1, 1, 2]
Output: 5
Explanation:
The two rabbits that answered "1" could both be the same color, say red.
The rabbit than answered "2" can't be red or the answers would be inconsistent.
Say the rabbit that answered "2" was blue.
Then there should be 2 other blue rabbits in the forest that didn't answer into the array.
The smallest possible number of rabbits in the forest is therefore 5: 3 that answered plus 2 that didn't.

Input: answers = [10, 10, 10]
Output: 11

Input: answers = []
Output: 0

在一个树林里,问了一群兔子,每只兔子回答有多少只兔子跟自己颜色相同(不包括自己)。求树林里最少有多少只兔子。

解决:首先要统计每种回答的个数。然后看某一种统计个数中能组队的兔子数量。

比如,说1的兔子有3只,那么有两只能互相组队,另外一只要再拉一个。所以就是4只兔子。

说10的兔子有5只,那么这五只组队,并且还要再拉6只,这样就有11只一样颜色的兔子。

所以,每种答案下的兔子数量为: (num + 1) * ((cnt - 1) / (num + 1) + 1) 

 1 class Solution {
 2 public:
 3     int numRabbits(vector<int>& answers) {
 4         int sum = 0;
 5         unordered_map<int, int> m;
 6         for (auto ans: answers) 
 7             ++m[ans];
 8         unordered_map<int, int>::const_iterator it;
 9         for (it = m.begin(); it!=m.end(); ++it) {
10             int num = it->first;
11             int cnt = it->second;
12             sum += (num + 1) * ((cnt - 1) / (num + 1) + 1);
13         }
14         return sum;
15     }
16 };

 

posted @ 2018-03-02 19:45  Zzz...y  阅读(169)  评论(0编辑  收藏  举报