题目:
n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。
输出描述:
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。
输入例子:
4 7 15 9 5
输出例子:
3
思路:
首先判断不存在的情况。
1)当总和不能均分时;
2)当数据中同时出现了偶数以及奇数时;
3)当所有数为偶数并且总和均分为奇数 or 所有数为奇数并且总和均分为偶数时;
以上任一条件满足的时候直接输出-1即可。
否则,一遍循环找比均分值大的数,然后相减除2,累计即可。
代码:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main() 6 { 7 int n, temp; 8 vector<int> apples; 9 cin >> n; 10 for (int i = 0; i < n; i++) 11 { 12 cin >> temp; 13 apples.push_back(temp); 14 } 15 /* 16 首先判断不存在的情况。 17 1)当总和不能均分时; 18 2)当数据中同时出现了偶数以及奇数时; 19 3)当所有数为偶数并且总和均分为奇数 or 所有数为奇数并且总和均分为偶数时; 20 */ 21 bool odd = false; //奇数 22 bool even = false; //偶数 23 int sum = 0; 24 for (auto item : apples) 25 { 26 sum += item; 27 if (item % 2 == 0) 28 even = true; 29 else 30 odd = true; 31 } 32 33 int average = sum / n; 34 35 if (sum % n) 36 { 37 cout << "-1"; 38 } 39 else if (odd && even) 40 { 41 cout << "-1"; 42 } 43 else if(even && average % 2 == 1) 44 { 45 cout << "-1"; 46 } 47 else if(odd && average % 2 == 0) 48 { 49 cout << "-1"; 50 } 51 else 52 { 53 int ans = 0; 54 for (auto item : apples) 55 { 56 if (item > average) 57 ans += (item - average) / 2; 58 } 59 cout << ans; 60 } 61 62 }