笔试中的一题。题目如下:
给出一个数组。如[1,1,2,2,3],
下标为0号球除了自己以外。有且还有1个球颜色和他一样,1号球也是这样
2号球也是代表除了自己以外,有且还有2个球和自己颜色相同。3号球同理
4号球也是代表除了自己以外,有且还有2个球和自己颜色相同。
问:这个圈内最少有几个球,才能组成这样的数组?
思路很明确:首先我们分析,最少的情况肯定是数组里面已经有的球,他们相互抵消。然后加上额外的球,即为所求。
现在遇到的问题就是,如果是[1,1].这两个球抵消。最少两个球就行了。
[2,2],两个球相互抵消,还需要一个球,总共要三个。
[2,2,2],三个球颜色相互一样。也只要三个球
[3,3]和[3,3,3]和[3,3,3,3]同理。都最少要四个球
那么思路就出来了:先排序数组。引用一个flag标志两个数是否相等。再用一个count计数。遇到一个数就让count=这个数+1.同时总球数加上count。
#include<algorithm>
#include<iostream>
using namespace std;
#include<vector>
int main()
{
vector<int> arr = { 3,1,2,2,1 };
sort(arr.begin(), arr.end());
int size = arr.size();
int count =0;
int flag = 0;
int pre = arr[0];//存储前一个数
for (int i = 0; i < size; i++)
{
if (pre == arr[i])
{
if (flag == 0)
{
flag = arr[i];
count+= (flag + 1);
}
else
{
flag--;
}
}
else
{
flag = arr[i];
count += (flag + 1);
}
pre = arr[i];
}
cout << count;
return 0;
}