1. 程式人生 > >分蘋果----網易2017內推筆試程式設計題合集(一)

分蘋果----網易2017內推筆試程式設計題合集(一)

[程式設計題] 分蘋果 n 只奶牛坐在一排,每個奶牛擁有 ai 個蘋果,現在你要在它們之間轉移蘋果,使得最後所有奶牛擁有的蘋果數都相同,每一次,你只能從一隻奶牛身上拿走恰好兩個蘋果到另一個奶牛上,問最少需要移動多少次可以平分蘋果,如果方案不存在輸出 -1。 
輸入描述:
每個輸入包含一個測試用例。每個測試用例的第一行包含一個整數 n(1 <= n <= 100),接下來的一行包含 n 個整數 ai(1 <= ai <= 100)。


輸出描述:
輸出一行表示最少需要移動多少次可以平分蘋果,如果方案不存在則輸出 -1。

輸入例子:
4
7 15 9 5

輸出例子:
3
感覺自己寫的程式不夠優雅,,注意,一個函式應該只有一個出口!!不要過分使用continue,而應該多使用break!

continue版,函式有多個出口,通過率為80%:

#include <iostream>
#include <vector>

using namespace::std;

int main() {
	int n;

	while (cin >> n) {
		if (n <= 0) break;

		int sum = 0;
		vector<int> vec(n);
		for (int i = 0; i < n; ++i) {
			cin >> vec[i];
			sum += vec[i];
		}

		if (sum % n != 0) {
			cout << -1 << endl;
			continue;
		}

		int avg = sum / n;
		int result = 0;
		for (int i = 0; i < n; ++i) {
			if (vec[i] < avg) {
				if ((avg - vec[i]) % 2 != 0) {
					cout << -1 << endl;
					continue;
				}
			}
			else if (vec[i] >= avg) {
                if ( ( vec[i] - avg ) % 2 != 0 ) {
					cout << -1 << endl;
					continue;
                }
				else result += (vec[i] - avg) / 2;
			}
		}

		cout << result << endl;
	}

	return 0;
}

break版,函式只有一個出口,通過率為100%:
#include <iostream>
#include <vector>

using namespace::std;

int main() {
	int n;

	while (cin >> n) {
		if (n <= 0) break;

		int sum = 0;
		vector<int> vec(n);
		for (int i = 0; i < n; ++i) {
			cin >> vec[i];
			sum += vec[i];
		}

		if (sum % n != 0) {
			cout << -1 << endl;
			continue;
		}

		int avg = sum / n;
		int result = 0;
		for (int i = 0; i < n; ++i) {
			if (vec[i] < avg) {
				if ((avg - vec[i]) % 2 != 0) {
					result = -1 ;
					break ;
				}
			}
			else if (vec[i] >= avg) {
                if ( ( vec[i] - avg ) % 2 != 0 ) {
					result = -1 ;
					break ;
                }
				else result += (vec[i] - avg) / 2;
			}
		}

		cout << result << endl;
	}

	return 0;
}