首页 > 试题广场 >

分糖果

[编程题]分糖果
  • 热度指数:1399 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

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


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


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

输入

4
7 15 9 5

输出

3
var n = readline();
n = Number(n);
var ai = readline().split(' ');
ai = ai.map(item => Number(item));
const total = ai.reduce((acc, current) => acc + current,0);
 
(function (arr,tot){
    if (tot % n == 0){
        console.log(count(arr,tot/n));
    }else{
        console.log(-1);
    }
})(ai,total);
 
function count(arr,sta){
    var sum = 0;
    for (i in arr){
        if (arr[i] > sta){
            if((arr[i] - sta)%2 === 0){
                sum += (arr[i] - sta)/2;
            }else{
                return sum = -1;
                break;
            }
        }
    }
    return sum;
}

发表于 2020-03-23 18:28:58 回复(0)
双端队列了解一下,算是贪心算法:
n = int(input())
nums = list(map(int, input().split(' ')))
from collections import deque
def solution(n, nums):
    t = 0
    res = 0
    for i in nums:
         t += i
    mean = t/n
    nums.sort(reverse = 1)
    nums = deque(nums)
    while nums:
        elem = nums.popleft()
        while elem > mean:
            if nums[-1] < mean:
                if (mean-nums[-1])%2 == 0:
                    elem -= 2
                    nums[-1] += 2
                    res += 1
                else:
                    return -1
            elif nums[-1] == mean:
                nums.pop()
        if elem != mean: return -1
    return res
 
 
print(solution(n,nums))


发表于 2020-03-21 18:48:53 回复(0)
import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNextInt()){
            int n=in.nextInt();
            int []a=new int[n];
            int sum=0;
            for(int i=0;i<n;i++){
                a[i]=in.nextInt();
                sum+=a[i];
            }
            int avg=sum/n;
            int sum1=0;//记录超过avg多少
            for(int i=0;i<n;i++){
                int temp=Math.abs(avg-a[i]);
                if(temp%2!=0){
                    System.out.println(-1);
                    return ;
                }
                if(a[i]>avg)sum1+=temp;
            }
            System.out.println(sum1/2);
        }
    }
}

发表于 2020-02-15 17:44:48 回复(0)
直接暴力统计就好了
#include <iostream>
#include <vector>
#include <cmath>
#include <climits>

using namespace std;

int main()
{
    cin.tie();
    ios::sync_with_stdio(false);
    
    int n;
    cin >> n;
    vector<int> input;
    int sum = 0;
    for (int i = 0; i < n; i++) {
        int now;
        cin >> now;
        sum += now;
        input.push_back(now);
    }
    
    if (sum % n != 0) {
        cout << -1 << endl;
        return 0;
    }
    
    sum /= n;
    int res = 0;
    for (int i = 0; i < n; i++) {
        int now = input[i];
        if (abs(sum - now) % 2 != 0) {
            cout << -1 << endl;
            return 0;
        } else {
            if (sum - now > 0) {
                res += (sum - now) / 2;
            }
        }
    }
    
    cout << res << endl;
    
    return 0;
}


发表于 2020-01-07 15:07:15 回复(0)
//
// Created by yuanhao on 2020-1-7.
//
#include <iostream>
#include <cmath>

using namespace std;

//n 个小朋友坐在一排,每个小朋友拥有 ai 个糖果,现在你要在他们之间转移糖果,使得最后所有小朋友拥有的糖果数都相同,每一次,你只能从一个小朋友身上拿走恰好两个糖果到另一个小朋友上,问最少需要移动多少次可以平分糖果,如果方案不存在输出 -1。
//
//
//输入描述:
//每个输入包含一个测试用例。每个测试用例的第一行包含一个整数n(1 <= n <= 100),接下来的一行包含n个整数ai(1 <= ai <= 100)。
//
//
//输出描述:
//输出一行表示最少需要移动多少次可以平分苹果,如果方案不存在则输出-1。
//示例1
//输入
//4
//7 15 9 5
//输出
//3
int main() {
    int n = 0;
    cin >> n;
    int *candy = new int[n];
    int sum = 0;
    for (int i = 0; i < n; ++i) {
        cin >> candy[i];
        sum += candy[i];
    }
    if (sum % n != 0) {
        cout << -1 << endl;
        delete[] candy;
        return 0;
    }
    int average = sum / n;

    int times = 0;
    for (int i = 0; i < n; ++i) {
        int d = abs(candy[i] - average);
        if (d % 2 != 0) {
            cout << -1 << endl;
            delete[] candy;
            return 0;
        }
        times += d / 2;
    }

    cout << times / 2 << endl;
    delete[] candy;
    return 0;
}

发表于 2020-01-07 10:26:16 回复(0)
n = int(input())
read_list = list(map(int, input().split()))
ava = sum(read_list)/n
count = 0
for num in read_list:
    if ava % 2 != 0 and num % 2 == 0:
        count = -1
        break
    elif ava % 2 == 0 and num % 2 != 0:
        count = -1
        break
    if num > ava: #如果上述条件都不满足,则必存在解
        while num != ava:
            num -= 2
            count += 1
print(count)
AC的Python解,很简单明了
发表于 2020-04-25 18:23:15 回复(1)
1.若糖果不能均分给小朋友,则方案不存在。返回-1
2.将每个小朋友手里的糖果数减去平均值,若存在有单数的情况,则方案不存在。
例如,若平均值为9颗,即每个小朋友最终手里要有9颗糖,假设小朋友a现在手里12颗,减去9颗后,剩3颗,而每次有且只能转移两颗糖,则不存在使得小朋友手里多的糖都转移掉的方案。返回-1
3.排除不存在的情况后,接下来,只需要将小朋友手里多的(即需要转移出去的)糖果总和/2即可。
n=int(input())
s=list(map(int,input().split()))
if sum(s)%n!=0:
    print(-1)            
else:
    k=sum(s)/n
    s1=[(c-k)%2 for c in s]
    if(sum(s1)!=0):
        print(-1)                
    else:
        s2=[c-k for c in s]
        s3= [c for c in s2 if c > 0]   ##取正数,只取负数也一样
        print(int(sum(s3)/2))


发表于 2020-04-08 17:28:23 回复(0)
先计算糖果的平均值,作为每个孩子的目标糖果数,然后遍历所有孩子的糖果,模拟分配糖果的过程
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().split(" ");
        int[] arr = new int[n];
        int total = 0;
        for(int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(strArr[i]);
            total += arr[i];
        }
        int avg = total / n;
        int count = 0;
        for(int num: arr){
            if((avg % 2 !=  0 && num % 2 == 0) || (avg % 2 ==  0 && num % 2 != 0)){
                count = -1;        // 由于是两个一拿,平均值和每个人的糖果数必须奇偶性相同,否则无解
                break;
            }
            while(num > avg){
                // 将糖多的孩子的糖果分出去
                num -= 2;
                count += 1;
            }
        }
        System.out.println(count);
    }
}

发表于 2021-08-31 17:55:58 回复(0)
while True:
    try:
        n=int(input())
        ls=list(map(int,input().split()))
        summ=sum(ls)
        if summ%n==0 and sum(abs(a-summ/n)%2==0 for a in ls)==n:
            print(int(sum(abs((a-summ/n)/2) for a in ls)/2))
        else:
            print(-1)
    except:
        break

发表于 2021-02-23 21:58:30 回复(0)
很简单 -1的情况就不讨论了 思路就是先对数组从小到大排序 然后统计出大于(小于)平均数的数 对这些数求和减去相应数量的平均数 再除以二就得到最少次数 因为糖果总要从大于平均向小于平均转移 只要大于平均数的都变成平均数 相应的小于平均数的也变成平均数 也就得到了答案
发表于 2024-06-25 22:29:53 回复(0)
/* 1.平均值要为整数  
    2.平均数和所有糖果数要同奇同偶  
    3.所有大于平均数的数,减去平均数后,除以2,最后商相加 => 传递次数
*/
function getName(num,str) {
    let arr = str.split(' '),
        average = arr.reduce((pre,cur) => +pre + +cur )/num;
    if(!Number.isInteger(average)) return-1;
    let state = arr.every(item => {
        returnaverage % 2 === 0 ? item % 2 === 0 : item % 2 !== 0;
    });
    if(!state) return-1;
    let arr1 = arr.filter(item => item > average),
        _num = 0;
    arr1.forEach(item => {
        _num += (item - average)/2;
    })
    return _num;
}
console.log(getName(readline(1),readline(2)))
发表于 2021-06-30 16:09:10 回复(0)
importjava.util.*;
 
 
publicclassMain {
 
    publicstaticvoidmain(String[] args) {
         
        Scanner sc = newScanner(System.in);
        intn = sc.nextInt();//小朋友个数
        inta[] = newint[n];//每个小朋友的糖果数组
        for(inti=0; i<n; i++) {
             
            a[i] = sc.nextInt();
        }
 
        assignCandy(n, a);
 
    }
     
     
    publicstaticvoidassignCandy(intn,int[] arr) {
         
        intsum = 0;//总糖果数
        intavg = 0;//平均糖果数 sum/n
        intcount = 0;//大于avg的数的总和。
        inttimes = 0;//移动的次数
 
        for(inti=0;i<n;i++) {
         
            sum += arr[i];
            avg = sum/n;
        }
        if(sum%n==0) {
            for(inti=0; i<n; i++) {
                if((arr[i]-avg)%2==0) {
                    if(arr[i]>avg) {
                        count += arr[i] -avg ;
                        if(count%2==0) {
                            times = count/2;
                             
                        }else{
                            System.out.println(-1);
                        }
                         
                    }
                }else{
                    System.out.println(-1);
                    return;
                }
            }
            System.out.println(times);
        }else{
            System.out.println(-1);
        }
 
    }
 
}
发表于 2021-04-24 06:30:26 回复(0)
这是考数学的吧
发表于 2021-01-08 10:05:36 回复(0)
import java.util.*;
//第三题;思路:计算平均值,再判断是否符合可平分,最后计算结果。
public class Main{
    public static void main(String [] args){
        Scanner in = new Scanner(System.in);
        int len = in.nextInt();
        int flag = 0;
        int [] apples = new int[len];
        int sum = 0;
        for(int i=0;i<len;i++){
            apples[i] = in.nextInt();
            sum+=apples[i];
        }
        int ave = sum/len;
        Arrays.sort(apples);
        for(int i=0;i<len;i++){
            if(Math.abs(ave-apples[i])%2!=0){
                flag = 1;
                System.out.println(-1);
                break;
            }
        }
       if(flag==0){
           int res = 0,index = 0;
           while(apples[index]<ave){
               res = res + ((ave-apples[index])/2);
               index++;
           }
           System.out.println(res);
       }
    }
}
发表于 2020-10-14 14:00:12 回复(0)
import sys
n = int(sys.stdin.readline().strip())
candy = [int(i) for i in sys.stdin.readline().strip().split()]
total = sum(candy)
if total % n != 0:
    print(-1)
else:
    goal = int(total / n)
    arr = [i-goal for i in candy] 
    if not all([i%2==0 for i in arr]):
        print(-1)
    else:
        neg = [-i for i in arr if i < 0]
        count = [i/2 for i in neg]
        count = sum(count)
        print(int(count))

发表于 2020-09-19 22:01:22 回复(0)
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.Linq;
classprogram
{
    staticvoidMain(string[] args)
    {
        intnum=int.Parse(Console.ReadLine());
        string[] arr=Console.ReadLine().Split(' ');
        int[] arrs=newint[num];
        intsum=0;
        for(inti=0;i<arrs.Length;i++)
        {
            arrs[i]=int.Parse(arr[i]);
            sum+=arrs[i];
        }
        if(sum%num!=0)
        {
            Console.WriteLine(-1);
        }
        else{
        intcount=0;
        boolistrue=true;
        for(inti=0;i<arrs.Length;i++)
        {
            if(arrs[i]>(sum/num))
            {
                if((arrs[i]-(sum/num))%2==0)
                {
                    count+=(arrs[i]-(sum/num))/2;
                }
                else{
                    Console.WriteLine(-1);
                    istrue=false;
                    break;
                }
            }
             
        }
        if(istrue)
        {
            Console.WriteLine(count);
        }
        }
    }
}
发表于 2020-07-16 19:48:04 回复(0)
//Java实现


import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            //小朋友人数
            int n = sc.nextInt();
            int[] nums = new int[n];
            int sum = 0;
            for (int i = 0; i < n; i++) {
                nums[i] = sc.nextInt();
                sum += nums[i];
            }
            System.out.println(candy(nums, n, sum));
        }
    }
 
    public static int candy(int[] nums, int n, int sum) {
        int res = 0;
        if (n == 1) return 0;
        if (sum % n != 0) {
            return -1;
        }
        int ave = sum / n;
        for (int i = 0; i < n; i++) {
            if (Math.abs(nums[i] - ave) % 2 == 1)
                return -1;
            if (nums[i] > ave) {
                res += (nums[i] - ave) / 2;
            }
        }
        return res;
    }
}

发表于 2020-06-09 11:23:43 回复(0)
def main(input_1, input_2):
    n = int(input_1) # 获取第一个输入,有几个小朋友
    ai_list = [int(i) for i in input_2.split(" ")] # 获取第二个输入,变成一个列表,代表每个小朋友手上的糖果数
    mean = sum(ai_list) / n # 平均值
    delta = [i-mean for i in ai_list] # 每个小朋友手上的糖果数减去平均值
    if sum(delta) != 0: # 如果不能平分的话 返回 -1
        return -1
    temp = list(filter(lambda x:x>0, delta)) # 过滤掉那些负数
    if sum(temp) % 2 == 1: # 正数字之和如果不能被 2 整除的话,那么不能够平分
        return -1
    else:
        return int(sum(temp)/2)
     
 
if __name__ == '__main__':
    input_1 = input()
    input_2 = input()
    print(main(input_1, input_2))

编辑于 2020-05-21 17:02:50 回复(0)
js : 参考了 Curious·Liu 同学的思路
let n = Number(readline())
let aiArr = readline().split(' ').map(item => Number(item))
let total = aiArr.reduce((a,b) => {return a + b}, 0)
function transfer (aiArr,average) {
    let num = 0
    for (let i = 0; i < aiArr.length; i++) {
        if (average < aiArr[i]) {
            if ((aiArr[i] - average) % 2 === 0){
                num += (aiArr[i] - average) / 2
            } else {
                return -1
            }
        }
    }
    return num > 0 ? num : -1
}
if (total % n === 0) {
     console.log(transfer(aiArr,total/n))
} else {
    console.log(-1)
}
发表于 2020-04-22 18:38:29 回复(0)
var n = readline();
var arr =readline().split(" ").map(Number);
var sum =0;
var zsum =0;
var fsum=0;
for(var i=0;i<arr.length;i++){
    sum+=arr[i];
}
var avg = sum/n;
if(sum%n!=0){
    console.log(-1);
}else{
    for(var j=0;j<arr.length;j++){
        if(arr[j]-avg>0){
            zsum +=(arr[j]-avg);
        }else{
            fsum +=(avg-arr[j]);
        }
    }
    var res = Math.max(zsum,fsum)
    console.log(res%2==0?res/2:-1);
}
发表于 2020-04-09 16:44:41 回复(0)