题意:说有一些兔子,它们有各种各样的颜色。一个人问其中一部分兔子问题,问题是除了该兔子以外,和这只兔子颜色相同的有多少只兔子。给出了这些数据,即和该兔子颜色相同的兔子,求最少有多少只兔子能够满足该情况。
思路:举例来说,2 2 3 4,说明和第一只兔子颜色相同的有两个,此时可以确定有3只兔子。在看第二只兔子,也是2,因为要求最小值,因此我们让和第二只兔子颜色相同的兔子是包括第一只兔子在内的的兔子,因此,兔子总数不会增加,还是3。接下来是第三只兔子,因为之前没有哪只兔子的数量和其相同,因此不能合并,此时应该加4,同理最后一只。也就是说,我们碰到一个数量时,能合并则尽量让其合并。合并的时候,若这次兔子的数量为3,则最多能合并3次,用一个数组记录即可。
代码:
class ColorfulRabbits
{
public:
int getMinimum(vector <int> replies)
{
int i,j,k;
int cnt[1000010];
clr(cnt,0);
int len = replies.size();
ll sum = replies[0] + 1;
cnt[replies[0]] = replies[0] ;
for(i = 1;i < len;++i){
int x = replies[i];
bool flag = false;
for(j = i-1; j >= 0;--j){
if(x == replies[j] && cnt[x]){
cnt[x]--;
flag = true;
break;
}
}
if(flag == false){
sum += replies[i]+1;
cnt[replies[i]] = replies[i];
}
}
return sum;
}
// $TESTCODE$
};