列表

详情


SH17. 分玩具

描述

幼儿园里有有M个小朋友在课件玩耍,每个人手中现有ni个玩具。为了公平起见,老师需要让每个小朋友手中有相同数量的玩具。假设老师每次只能从一个人手中拿走两个玩具并给另一个小朋友。求老师最少需要做多少次这样的玩具转移。如果不存在可行的方案则输出-1。

输入描述

每个输入包含一个测试用例。每个测试用例的第一行包含一个整数M(1 <= M<= 100),接下来的一行包含M个整数ni(1 <= ni <= 100)。

输出描述

输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。

示例1

输入:

4
7 15 9 5

输出:

3

示例2

输入:

2
3 6

输出:

-1

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-07

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int m,i,sum=0,tmp,ave,nums=0;
	scanf("%d",&m);
	int a[m];
	for(i=0;i<m;i++)
	{
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	if(sum%m!=0)
	{
		printf("-1");
		return 0;
	}
	ave=sum/m;
	for(i=0;i<m;i++)
	{
		tmp=abs(ave-a[i]);
		if(tmp==0)
			continue;
		if(tmp%2!=0)
		{
			printf("-1");
			return 0;
		}
		if(a[i]>ave)
		{
			nums+=tmp/2;
		}
	}
	printf("%d",nums);
}

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-05-03

#include <stdio.h>
int main(){
    int M,sum = 0,avg,count = -1,more = 0;
    scanf("%d", &M);
    int N[M];
    for(int i = 0;i<M;i++){
        scanf("%d", &N[i]);
        sum += N[i];
    }
    if(sum%M != 0){
        printf("%d" , count);
        return 0;
    }
    else{
        avg = sum/M;
        for(int i = 0;i<M;i++){
            if(N[i]>avg){
                more += N[i]-avg;
            }
        }
    }
    if(more%2 == 0)
        count = more/2;
    printf("%d" , count);
    return 0;
}

上一题