给定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; //输出记录的最小跨越组
}