列表

详情


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;
}

上一题