分苹果,求最小跨越组

        给定N个正整数代表各组位置总数,M个人,每个人掌握K个苹果。现在对M个人的苹果分配位置。要求,每个人的苹果应连续分配。求解最小分配跨越组数。题中假设N个正整数之和大于M*K. 举例:N=4个正整数为10,12,15,25,M=3,K=13,则最小跨越组数为1。

 

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void bubble_sort(int arr[], int len)          //定义一个冒泡排列的函数
{
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] < arr[j + 1]) 
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}


int main()
{
    int PeopleNum;      //定义人数
    int AppleNum;       //定义每个人的苹果数
    int ArrayNum;       //定义一共要分几组
    cout<<"Input Number of people PeopleNum=";       //输入人数、苹果数、组数三个变量
    cin>>PeopleNum;
    cout<<"Input Number of apples per person AppleNum=";
    cin>>AppleNum;
    cout<<"Input Number of groups ArrayNum=";
    cin>>ArrayNum;
    int AppleArray[ArrayNum];     //记录每组格子数的数组
    for ( int i = 0; i < ArrayNum; i++)       //为数组赋值
    {
        cout<<"Input the size of "<<i+1<<" group:";
        cin>>AppleArray[i];
    }
    
    int len = (int) sizeof(AppleArray) / sizeof(*AppleArray);    
    bubble_sort(AppleArray, len);           //将存有每组格子数的数组从大到小排列,第一个元素则为最大组


    int TotalArray;      //总格子数
    for (int z = 0; z < ArrayNum; z++)  
    {
      TotalArray+=AppleArray[z];
    }
    
    if (PeopleNum*AppleNum>TotalArray)    //判断总格子数是否大于总苹果数
    {
      cout<<"error:The total number of apples must be less than the total number of the array ";     //如果总格子数小于总苹果数,输出错误提示
    }

    int Difference;    //定义最大格子数和每个人的苹果数的差
    int MinAcross=0;   //定义变量最小跨越组
    for(int i=0;i<PeopleNum;i++)       
    {
    Difference=AppleArray[0]-AppleNum;     //用最大的格子数减去每个人的苹果数
    if(Difference>=0)                     //如果结果刚好大于等于0,则说明最大组能放下一个人的苹果,不记录跨越组
    {
      AppleArray[0]=Difference;        //将最大组剩余的格子数,重新赋值给数组中第一个元素
    }
    if(Difference<0)          //如果结果小于0,则说明最大组不够放一个人苹果
    {
      AppleArray[0]=0;             //最大组格子都被占用,所以赋值0
      AppleArray[1]+=Difference;   //把剩余的苹果往第二个格子里放
      MinAcross++;                //此时记录一个跨域组
      if(AppleArray[1]<0)        //如果第二个格子仍然小于0,说明最大的两个都放不下一个人的苹果
      {
      for(int i=1;i<ArrayNum;i++)    //通过循环,找出究竟前几个组能放下一个人的苹果
      {
      AppleArray[i+1]+=AppleArray[i];
      AppleArray[i]=0;
      MinAcross++;
      if(AppleArray[i+1]>0)      //当AppleArray[i+1]>0时,说明格子有剩余,放完了苹果,此时跳出循环
      {
        break;
      }
      }
      }
    
    }
    bubble_sort(AppleArray, len);   //此时一个人的苹果放完了,将数组再次从大到小排列,再回到循环第二个人的苹果,直到所有人循环完毕
    }
    cout<<"MinAcross: "<<MinAcross<<endl;   //输出记录的最小跨越组
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值