WY10. 分苹果
描述
n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。输入描述
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。输出描述
输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出 -1。示例1
输入:
4 7 15 9 5
输出:
3
C 解法, 执行用时: 1ms, 内存消耗: 228KB, 提交时间: 2018-08-30
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,n; int a[1000]; scanf("%d",&n); int sum=0; int avr=0; int t=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum = sum + a[i]; } if(sum%n != 0 ) { printf("-1"); return 0; } avr = sum/n; for(i=0;i<n;i++) { sum=abs(a[i]-avr); if(sum%2 != 0) { printf("-1"); return 0; }else { t = t+sum; } } t = t/4; printf("%d",t); return 0; }
Pascal 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2018-09-08
var a:array[0..110] of longint; n,i,s,ans:longint; begin read(n); s:=0; for i:=1 to n do begin read(a[i]); s:=s+a[i]; end; if s mod n<>0 then begin writeln(-1); halt; end; s:=s div n; ans:=0; for i:=1 to n do if abs(a[i]-s) mod 2=1 then begin writeln(-1); halt; end else if a[i]>s then ans:=ans+(a[i]-s) div 2; writeln(ans); end.
C 解法, 执行用时: 1ms, 内存消耗: 356KB, 提交时间: 2018-09-13
#include<stdio.h> int main(int argc, char const *argv[]) { int n, a[100] = {0}; int sum = 0; int count = 0; int avg = 0; int flag = 0; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d", &a[i]); } for (int i = 0; i < n; ++i) { sum += a[i]; } avg = sum / n; for (int i = 0; i < n; ++i) { if((a[i] > avg ?(a[i] - avg):(avg - a[i])) % 2) { flag = 1; break; } } if(flag || (sum % n)) printf("-1"); else { for (int i = 0; i < n; ++i) { count += ((a[i] > avg ?(a[i] - avg):(avg - a[i])) / 2); } printf("%d\n", count / 2); } return 0; }
C 解法, 执行用时: 1ms, 内存消耗: 364KB, 提交时间: 2018-09-03
#include "stdio.h" int main() { int m,n[100]; int i,flag=0,sum = 0,avl = 0,cnt =0; scanf("%d",&m); i = 0; while(i<m) { scanf("%d",&n[i]); i++; } i = 0; while(i<m) { sum += n[i]; i++; } if (!flag && (sum%m == 0)) { avl = sum /m; i=0; while ((i) < m) { if (n[i]<avl) { cnt += (avl - n[i])/2; } else { if ((n[i] - avl)%2 == 1) { flag = 1; } } i++; } } else { flag =1; } if (!flag) { printf("%d",cnt); } else { printf("-1"); } getchar(); return 0 ; }
C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-16
#include<stdio.h> #include<math.h> int main() { int n; scanf("%d",&n); int a[100],ave,sum=0,cnt=0; for(int i=0;i<n;i++) { scanf("%d",a+i); sum+=a[i]; } if(sum%n==0) ave=sum/n; else {printf("-1");return 0;} for(int j=0;j<n;j++) { if ( (abs(a[j]-ave) % 2) != 0 ){printf("-1");return 0;} else if( (a[j]-ave) >= 0) cnt += (a[j]-ave)/2; } printf("%d",cnt); return 0; }