算法 拿硬币

桌上有 n 堆硬币,每堆的数量保存在数组 arr 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有硬币的最少次数。

示例 1:

输入:[4,2,1]

输出:4

解释:第一堆硬币币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

示例 2:

输入:[2,3,10]
int TakeCoin(vector& coin)
{
int cnt = 0;
for (auto c : coin)
{
cnt += c / 2; // 前几次都拿两枚硬币
cnt += c % 2; // 不够两枚,拿一枚
}
return cnt;
}
输出:8

算法一:

int minCount(int* arr, int num)
{
    
    
	int i, count = 0;	
	for (i = 0;i < num;i++) 
	{
    
    
		if (arr[i] % 2 != 0)//不能整除  次数+1
		{
    
    
			count += (arr[i] + 1) / 2;
		}
		else {
    
       //整除
			count += arr[i] / 2;
		}
	}
	return count;
}

算法二:

int TakeCoin(vector<int>& coin)
{
    
    
	int cnt = 0;
	for (auto c : coin)
	{
    
    
		cnt += c / 2;		// 前几次都拿两枚硬币
		cnt += c % 2;		// 不够两枚,拿一枚
	}
	return cnt;
}

测试测试用例:

int main()
{
    
    
	vector<int> coin1 = {
    
     4,2,1 };
	auto ret1 = TakeCoin(coin1);

	vector<int> coin2 = {
    
     2,3,10 };
	auto ret2 = TakeCoin(coin2);

	cout << ret1 << "  " << ret2  << endl;

	return 0;
}

猜你喜欢

转载自blog.csdn.net/Gunanhuai/article/details/109126708