7.拿硬币[数组]
桌上有 n 堆硬币,每堆的数量保存在数组 arr 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有硬币的最少次数。
示例 1:
输入:[4,2,1]
输出:4
解释:第一堆硬币币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。
示例 2:
输入:[2,3,10]
输出:8
#include <stdio.h>
int main()
{
char arr[20005];
int i=0;
while(scanf("%c",&arr[i]))
{
char c=getchar();
if(c=='\n')
break;
i++;
}
int length=i+1;
int brr[20005];
for(int i=0;i<length;i++)
{
brr[i]=arr[i]-'0';
}
int count=0;
int x=0;
for(int i=0;i<length;i++)
{
if(brr[i]%2!=0)
{
x=(brr[i]+1)/2;
}
else
{
x=brr[i]/2;
}
count+=x;
}
printf("%d",count);
return 0;
}
答案解析
算法一:依次遍历数组,累加每个数据(每堆硬币)需要的最少次数.
1. //第七题. 拿硬币
2. int MinCount(int* arr, int n)
3. {
4. int num = 0;//次数
5. for(int i=0;i<n;i++)
6. {
7. num += (arr[i]+1)/2;//+1是为了解决奇数的问题
8. }
9. return num;
10. }