1. 程式人生 > >781. Rabbits in Forest

781. Rabbits in Forest

min tor turn all xpl them IT plan input

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" cant 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 didnt answer into the array. The smallest possible number of rabbits in the forest is
therefore 5: 3 that answered plus 2 that didnt. 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 };

781. Rabbits in Forest