C++实现分苹果问题

C++实现分苹果问题题目内容问题:n只奶牛坐在一排,每个奶牛拥有ai个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出-1。输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1<=n<=100),接下来的一行包含n个整数…

大家好,欢迎来到IT知识分享网。C++实现分苹果问题"

题目内容
问题: n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述: 每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。
输出描述: 输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
测试用例

  输入例子:  
  4
  7  15  9  5  
  输出例子:
  3     

解题思路:
1、因为是平分苹果、因此苹果总数必须是奶牛个数的整数倍
2、算出苹果的平均数、用每个奶牛的苹果减去平均数、得到每个奶牛的多出或者相差的苹果数
3、因为每次只能移动两个苹果、因此每个奶牛对出或者相差的苹果数必须是2的倍数(也就是对num % 2 == 0)
4、将相减大于0的所有苹果相加除以2就是需要移动的次数(因为每次只能移动两个)
代码示例

#include <iostream>
using namespace std;

int main()
{ 
   
	int count = 0;       
	int size = 0;                // 奶牛的个数
	cout << "输入个数:" << endl;
	cin >> size;
	
	int *arr = new int[size];    // 存放苹果个数
	cout << "输入每个奶牛身上苹果个数:" << endl;
	for (int i = 0; i < size; ++i)
	{ 
   
		cin >> arr[i];
		count += arr[i];  // 将所有苹果加起来
	}

	if (count % size != 0)  // 判断苹果总数是否是奶牛总数的倍数
	{ 
   
		cout << "分配失败:" << -1 << endl;
		return 0;
	}
	
	count = count / size;  // 计算平均数
	int sum = 0;
	for (int i = 0; i < size; ++i)
	{ 
   
		arr[i] -= count;      // 此处是直接在数组上进行操作
		if (arr[i] % 2 != 0)  // 判断差值是否是2的倍数
		{ 
   
			cout << "分配失败:" << -1 << endl;
			return 0;
		}

		if(arr[i] >= 0)    // 将相减大于0的苹果加起来
		{ 
   
			sum+= arr[i];
		}
	}

	cout << "次数:" << sum / 2 << endl;

	return 0;
}

总结:第一次写博客,将自己解决分苹果问题的思路和代码分享给大家、希望可以互相学习^^!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/16147.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信