58-求圈内最少几个球可以组成该数组

笔试中的一题。题目如下:
给出一个数组。如[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;
}

Guess you like

Origin blog.csdn.net/qq_40861091/article/details/101193546