[编程题]分苹果
n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。
输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
输入例子:
4
7 15 9 5
输出例子:
3
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <numeric>
#include <functional>
using namespace std;
int main()
{
int iNum;
cin>>iNum;//定义有多少奶牛
vector<int>iVec;//用于存放每个奶牛的苹果数
vector<int>iVecSubtraction;//用于存放每个奶牛苹果数量与平均数的差值
int sum = 0;//用于存放差值是大于0的
int minNum;///最小的次数
for(int i = 0; i < iNum;i++)
{
int iNumTemp;
cin>>iNumTemp;输入每个奶牛的苹果数
iVec.push_back(iNumTemp);/获得每个奶牛的苹果数量
}
///求和 求得所有奶牛拥有的苹果数量
int sumApple = accumulate(iVec.begin(),iVec.end(),0);
if(sumApple % iNum != 0)
{
cout<<"-1"<<endl;
return 0;
}
else
{
/得到差值的vector
int averageApple = sumApple / iNum;
for(int i = 0; i < iVec.size();i++)
{
iVecSubtraction.push_back(iVec[i] - averageApple);
}
判断差值的vector是否满足方案
如果差值有一个为奇数就不满足方案
bool bRet = false;
for(int i = 0;i < iVecSubtraction.size();i++)
{
if(abs(iVecSubtraction[i]) % 2 != 0)
{
bRet = true;
break;
}
}
if(bRet)///不符合要求的
{
cout<<"-1"<<endl;
return 0;
}
else///符合要求的
{
for(int i = 0; i < iVecSubtraction.size();i++)
{
if(iVecSubtraction[i] > 0)
sum += iVecSubtraction[i];
}
minNum = sum / 2;
cout<<minNum<<endl;
}
}
system("pause");
return 0;
}