NOWCODER编程题——分苹果

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:26   1034   0

题目描述

n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。

输入描述:每个输入包含一个测试用例。每个测试用例的第一行包含一个整数 n(1 <= n <= 100),接下来的一行包含 n 个整数 ai(1 <= ai <= 100)。

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

示例:

  • 输入 4

7 15 9 5

  • 输出 3

解题思路

  1. 求这些苹果的平均值,如果sum%n !=0,说明这些苹果不能被平分为整数,输出-1;
  2. 求每个奶牛拥有的苹果数和平均数的差值dif,如果dif%2 !=0 ,说明dif不是2的倍数,不能每次取出2分给另外一只奶牛,输出-1;
  3. 如果奶牛拥有的苹果数和平均数差值为0,直接进入下一次循环;
  4. 如果差值是2的倍数,就往后找大于平均数的元素作为填补。

代码实现

#include<iostream>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[n];
    int sum=0;
    for(int i=0;i<n;++i)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if(sum%n!=0)
    {
        cout<<-1<<endl;
        return 0;
    }
    int app_ave=sum/n;//平均数
    int count=0;
    for(int i=0;i<n;i++)
    {
        int dif=a[i]-app_ave;
        if(a[i]==app_ave)
            continue;
        if(dif%2!=0)
        {
            cout<<-1<<endl;
            return 0;
        }
        for(int j=0;j<n;j++)
        {
            if(a[i]==a[j])
                continue;
            while(dif<0 && a[j]>app_ave)
            {
                count++;
                a[i]+=2;
                a[j]-=2;
                dif=a[i]-app_ave;
            }
        }
    }
    cout<<count<<endl;
    return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP