zoukankan      html  css  js  c++  java
  • 牛客网-分苹果(网易)

    题目描述

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

    输入描述:

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

    输出描述:

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

    输入

    4
    7 15 9 5

    输出

    3

    解题思路:

    (1)首先计算所有奶牛拥有的苹果之和,除以奶牛个数,若无余数,说明是可以平分的,若有余数,返回-1;

    (2)因为每一次只能从奶牛身上拿走两个苹果,所以需要计算每个奶牛拥有的苹果数减去平均数,看这个差是否为2的倍数,若不是,返回-1;若是,统计所有差大于0(或者小于0)的差之和,然后除以2,则为最小需要移动的次数

    7 15 9 5  average=9;

    -2 6 0 -4    正数之和等于负数之和的绝对值 

    找到所有为正数的值的和,为6,   6/2=3

    代码如下:

    #include<iostream>
    #include<vector>
    using namespace std;
    int Minimal(vector<int> vec,int n){
        int sum=0;
        for(int i=0;i<n;++i)
            sum+=vec[i];
        if(sum%n!=0) //判断是否能够平均
            return -1;
        int average=sum/n; 
        int num=0;
        for(int i=0;i<n;++i){
            if((vec[i]-average)%2!=0){ //因为每次需要移动两个苹果,所以需要差为2的倍数
                return -1;
                break;
            }
            else{
                if((vec[i]-average)>0){//统计所有差为正数的差的和(或者统计所有差为负数的差的和)
                    num+=vec[i]-average;
                }
            }
        }
        return num/2; //每次移动两个,计算移动的次数
            
    }
    int main(){
        int n;
        vector<int> vec(100);
        cin>>n;
        for(int i=0;i<n;++i)
            cin>>vec[i];
        int result=Minimal(vec,n);
        cout<<result<<endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    yii源码五
    yii源码四
    yii源码三 -- db
    yii源码二 -- interfaces
    yii源码一 -- CComponent
    jquery效果 窗口弹出案例
    JS滚动条
    JS表单验证
    [TCP/IP] TCP流和UDP数据报之间的区别
    [TCP/IP] 关闭连接后为什么客户端最后还要等待2MSL
  • 原文地址:https://www.cnblogs.com/rgly/p/7425640.html
Copyright © 2011-2022 走看看