桌上有 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;
}