zhangbaochong

题目:

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 }

 

分类:

技术点:

相关文章: