n 个小朋友坐在一排,每个小朋友拥有 ai 个糖果,现在你要在他们之间转移糖果,使得最后所有小朋友拥有的糖果数都相同,每一次,你只能从一个小朋友身上拿走恰好两个糖果到另一个小朋友上,问最少需要移动多少次可以平分糖果,如果方案不存在输出 -1。
n 个小朋友坐在一排,每个小朋友拥有 ai 个糖果,现在你要在他们之间转移糖果,使得最后所有小朋友拥有的糖果数都相同,每一次,你只能从一个小朋友身上拿走恰好两个糖果到另一个小朋友上,问最少需要移动多少次可以平分糖果,如果方案不存在输出 -1。
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1 <= n <= 100),接下来的一行包含n个整数ai(1 <= ai <= 100)。
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。
4 7 15 9 5
3
var n = readline(); n = Number(n); var ai = readline().split(' '); ai = ai.map(item => Number(item)); const total = ai.reduce((acc, current) => acc + current,0); (function (arr,tot){ if (tot % n == 0){ console.log(count(arr,tot/n)); }else{ console.log(-1); } })(ai,total); function count(arr,sta){ var sum = 0; for (i in arr){ if (arr[i] > sta){ if((arr[i] - sta)%2 === 0){ sum += (arr[i] - sta)/2; }else{ return sum = -1; break; } } } return sum; }
n = int(input()) nums = list(map(int, input().split(' '))) from collections import deque def solution(n, nums): t = 0 res = 0 for i in nums: t += i mean = t/n nums.sort(reverse = 1) nums = deque(nums) while nums: elem = nums.popleft() while elem > mean: if nums[-1] < mean: if (mean-nums[-1])%2 == 0: elem -= 2 nums[-1] += 2 res += 1 else: return -1 elif nums[-1] == mean: nums.pop() if elem != mean: return -1 return res print(solution(n,nums))
import java.util.*; public class Main{ public static void main(String args[]){ Scanner in=new Scanner(System.in); while(in.hasNextInt()){ int n=in.nextInt(); int []a=new int[n]; int sum=0; for(int i=0;i<n;i++){ a[i]=in.nextInt(); sum+=a[i]; } int avg=sum/n; int sum1=0;//记录超过avg多少 for(int i=0;i<n;i++){ int temp=Math.abs(avg-a[i]); if(temp%2!=0){ System.out.println(-1); return ; } if(a[i]>avg)sum1+=temp; } System.out.println(sum1/2); } } }
#include <iostream> #include <vector> #include <cmath> #include <climits> using namespace std; int main() { cin.tie(); ios::sync_with_stdio(false); int n; cin >> n; vector<int> input; int sum = 0; for (int i = 0; i < n; i++) { int now; cin >> now; sum += now; input.push_back(now); } if (sum % n != 0) { cout << -1 << endl; return 0; } sum /= n; int res = 0; for (int i = 0; i < n; i++) { int now = input[i]; if (abs(sum - now) % 2 != 0) { cout << -1 << endl; return 0; } else { if (sum - now > 0) { res += (sum - now) / 2; } } } cout << res << endl; return 0; }
// // Created by yuanhao on 2020-1-7. // #include <iostream> #include <cmath> using namespace std; //n 个小朋友坐在一排,每个小朋友拥有 ai 个糖果,现在你要在他们之间转移糖果,使得最后所有小朋友拥有的糖果数都相同,每一次,你只能从一个小朋友身上拿走恰好两个糖果到另一个小朋友上,问最少需要移动多少次可以平分糖果,如果方案不存在输出 -1。 // // //输入描述: //每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1 <= n <= 100),接下来的一行包含n个整数ai(1 <= ai <= 100)。 // // //输出描述: //输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。 //示例1 //输入 //4 //7 15 9 5 //输出 //3 int main() { int n = 0; cin >> n; int *candy = new int[n]; int sum = 0; for (int i = 0; i < n; ++i) { cin >> candy[i]; sum += candy[i]; } if (sum % n != 0) { cout << -1 << endl; delete[] candy; return 0; } int average = sum / n; int times = 0; for (int i = 0; i < n; ++i) { int d = abs(candy[i] - average); if (d % 2 != 0) { cout << -1 << endl; delete[] candy; return 0; } times += d / 2; } cout << times / 2 << endl; delete[] candy; return 0; }
n = int(input()) read_list = list(map(int, input().split())) ava = sum(read_list)/n count = 0 for num in read_list: if ava % 2 != 0 and num % 2 == 0: count = -1 break elif ava % 2 == 0 and num % 2 != 0: count = -1 break if num > ava: #如果上述条件都不满足,则必存在解 while num != ava: num -= 2 count += 1 print(count)AC的Python解,很简单明了
n=int(input()) s=list(map(int,input().split())) if sum(s)%n!=0: print(-1) else: k=sum(s)/n s1=[(c-k)%2 for c in s] if(sum(s1)!=0): print(-1) else: s2=[c-k for c in s] s3= [c for c in s2 if c > 0] ##取正数,只取负数也一样 print(int(sum(s3)/2))
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); String[] strArr = br.readLine().split(" "); int[] arr = new int[n]; int total = 0; for(int i = 0; i < n; i++) { arr[i] = Integer.parseInt(strArr[i]); total += arr[i]; } int avg = total / n; int count = 0; for(int num: arr){ if((avg % 2 != 0 && num % 2 == 0) || (avg % 2 == 0 && num % 2 != 0)){ count = -1; // 由于是两个一拿,平均值和每个人的糖果数必须奇偶性相同,否则无解 break; } while(num > avg){ // 将糖多的孩子的糖果分出去 num -= 2; count += 1; } } System.out.println(count); } }
while True: try: n=int(input()) ls=list(map(int,input().split())) summ=sum(ls) if summ%n==0 and sum(abs(a-summ/n)%2==0 for a in ls)==n: print(int(sum(abs((a-summ/n)/2) for a in ls)/2)) else: print(-1) except: break
import sys n = int(sys.stdin.readline().strip()) candy = [int(i) for i in sys.stdin.readline().strip().split()] total = sum(candy) if total % n != 0: print(-1) else: goal = int(total / n) arr = [i-goal for i in candy] if not all([i%2==0 for i in arr]): print(-1) else: neg = [-i for i in arr if i < 0] count = [i/2 for i in neg] count = sum(count) print(int(count))
//Java实现 import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { //小朋友人数 int n = sc.nextInt(); int[] nums = new int[n]; int sum = 0; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); sum += nums[i]; } System.out.println(candy(nums, n, sum)); } } public static int candy(int[] nums, int n, int sum) { int res = 0; if (n == 1) return 0; if (sum % n != 0) { return -1; } int ave = sum / n; for (int i = 0; i < n; i++) { if (Math.abs(nums[i] - ave) % 2 == 1) return -1; if (nums[i] > ave) { res += (nums[i] - ave) / 2; } } return res; } }
def main(input_1, input_2): n = int(input_1) # 获取第一个输入,有几个小朋友 ai_list = [int(i) for i in input_2.split(" ")] # 获取第二个输入,变成一个列表,代表每个小朋友手上的糖果数 mean = sum(ai_list) / n # 平均值 delta = [i-mean for i in ai_list] # 每个小朋友手上的糖果数减去平均值 if sum(delta) != 0: # 如果不能平分的话 返回 -1 return -1 temp = list(filter(lambda x:x>0, delta)) # 过滤掉那些负数 if sum(temp) % 2 == 1: # 正数字之和如果不能被 2 整除的话,那么不能够平分 return -1 else: return int(sum(temp)/2) if __name__ == '__main__': input_1 = input() input_2 = input() print(main(input_1, input_2))