大家好,欢迎来到IT知识分享网。
题目内容
问题: 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