版主太客气了,每次都给评分
不过,楼上的代码仍然过不了一些特殊的数据。
比如:
10 6
9 9 5 9 3 3
10 6
3 1 7 8 10 7
8 6
1 1 10 4 7 5
-----------------
3 30
3 35
2 17

不过,楼上的代码仍然过不了一些特殊的数据。
比如:
10 6
9 9 5 9 3 3
10 6
3 1 7 8 10 7
8 6
1 1 10 4 7 5
-----------------
3 30
3 35
2 17
程序代码:#include <iostream>
using namespace std;
const size_t MAX_SIZE = 30;
struct Pi
{
unsigned short m_Value;
unsigned short m_Sum;
};
struct Pi piArray[MAX_SIZE];
size_t nValue;//表示仓库的数量
size_t mValue;//表示人的个数
bool getConsoleInputs()
{//获取终端的输入信息
size_t i=0;
cin >> nValue >> mValue;
while (i!=mValue && cin>>piArray[i].m_Value)
{
piArray[i].m_Sum = 0;//初始化最初分配到的仓库数量为零
++i;
}
return (nValue && mValue);
}
/*
*找出一定范围内[0, suffix]平均Pi值最大的下标值
*/
size_t findMaxAvgPiIndex(size_t suffix)
{
size_t i=0, k=0;
for (; i<=suffix; ++i)
{
if ((piArray[i].m_Value/piArray[i].m_Sum) >
(piArray[k].m_Value/piArray[k].m_Sum))
{
k = i;
}
}
return k;
}
/*
*找出一定范围内[0, suffix]平均Pi值最小的下标值
*/
size_t findMinAvgPiIndex(size_t suffix)
{
size_t i=0, k=0;
for (; i<=suffix; ++i)
{
if ((piArray[i].m_Value/piArray[i].m_Sum) <
(piArray[k].m_Value/piArray[k].m_Sum))
{
k = i;
}
}
return k;
}
/*
*调整每个人所分配到的仓库数量
*根据仓库的数量(nValue) 人的个数(mValue)以及Pi
*进行人员的合理分配使得到最高的安全线
*返回总的看守仓库的人数
*/
size_t adjustm_Sum()
{
size_t i, j, suffix=0;
piArray[0].m_Sum = 1;//开始的状态为分配一个仓库数量
for (i=1; i<nValue; ++i)
{
if (i < mValue)
{
j = findMaxAvgPiIndex(suffix);
if (piArray[j].m_Value/(piArray[j].m_Sum+1) >= piArray[suffix+1].m_Value)
{
++(piArray[j].m_Sum);
}
else
{
++(piArray[suffix+1].m_Sum);
++suffix;//添加新的元素
}
}
else
{
j = findMaxAvgPiIndex(suffix);
++(piArray[j].m_Sum);
}
}
return suffix+1;
}
//piArray数组降序排序
void sort()
{//采用选择法排序
size_t i, j, k;
unsigned short temp;
for (i=0; i<mValue-1; ++i)
{
k = i;
for (j=i+1; j<mValue; ++j)
{
if (piArray[j].m_Value > piArray[k].m_Value)
{
k = j;
}
}
if (k != i)
{
temp = piArray[k].m_Value;
piArray[k].m_Value = piArray[i].m_Value;
piArray[i].m_Value = temp;
}
}
}
/*
*输出最高的安全线
*/
void showHighL()
{
size_t suffix = adjustm_Sum();
size_t i = findMinAvgPiIndex(suffix-1);
printf("%d \n\n", piArray[i].m_Value/piArray[i].m_Sum);
}
void function()
{
while (getConsoleInputs())
{
sort();
showHighL();
}
}
int main(void)
{
function();
return 0;
}
程序代码:#include <iostream>
using namespace std;
const size_t MAX_SIZE = 30;
struct Pi
{
unsigned short m_Value;
unsigned short m_Sum;
};
struct Pi piArray[MAX_SIZE];
size_t nValue;//表示仓库的数量
size_t mValue;//表示人的个数
bool getConsoleInputs()
{//获取终端的输入信息
size_t i=0;
cin >> nValue >> mValue;
while (i!=mValue && cin>>piArray[i].m_Value)
{
piArray[i].m_Sum = 0;//初始化最初分配到的仓库数量为零
++i;
}
return (nValue && mValue);
}
/*
*找出一定范围内[0, suffix]平均Pi值最大的下标值
*/
size_t findMaxAvgPiIndex(size_t suffix)
{
size_t i=0, k=0;
for (; i<=suffix; ++i)
{
if ((piArray[i].m_Value/piArray[i].m_Sum) >
(piArray[k].m_Value/piArray[k].m_Sum))
{
k = i;
}
}
return k;
}
/*
*找出一定范围内[0, suffix]平均Pi值最小的下标值
*/
size_t findMinAvgPiIndex(size_t suffix)
{
size_t i=0, k=0;
for (; i<=suffix; ++i)
{
if ((piArray[i].m_Value/piArray[i].m_Sum) <
(piArray[k].m_Value/piArray[k].m_Sum))
{
k = i;
}
}
return k;
}
/*
*找出一定范围内[0, suffix]平均Pi在m_Sum加上1的情况下值最大的下标值
*/
size_t findInreMaxAvgPiIndex(size_t suffix)
{
size_t i=0, k=0;
for (; i<=suffix; ++i)
{
if ((piArray[i].m_Value/(piArray[i].m_Sum+1)) >
(piArray[k].m_Value/(piArray[k].m_Sum+1)))
{
k = i;
}
}
return k;
}
/*
*调整每个人所分配到的仓库数量
*根据仓库的数量(nValue) 人的个数(mValue)以及Pi
*进行人员的合理分配使得到最高的安全线
*返回总的看守仓库的人数
*/
size_t adjustm_Sum()
{
size_t i, j, k, suffix=0;
piArray[0].m_Sum = 1;//开始的状态为分配一个仓库数量
for (i=1; i<nValue; ++i)
{
if (suffix < mValue)
{
j = findMaxAvgPiIndex(suffix);
k = findInreMaxAvgPiIndex(suffix);
if (piArray[k].m_Value/(piArray[k].m_Sum+1) >= piArray[suffix+1].m_Value)
{
++(piArray[k].m_Sum);
}
else if (piArray[j].m_Value/(piArray[j].m_Sum+1) >= piArray[suffix+1].m_Value)
{
++(piArray[j].m_Sum);
}
else
{
++(piArray[suffix+1].m_Sum);
++suffix;//添加新的元素
}
}
else
{
j = findMaxAvgPiIndex(suffix);
++(piArray[j].m_Sum);
}
}
return suffix+1;
}
//piArray数组降序排序
void sort()
{//采用选择法排序
size_t i, j, k;
unsigned short temp;
for (i=0; i<mValue-1; ++i)
{
k = i;
for (j=i+1; j<mValue; ++j)
{
if (piArray[j].m_Value > piArray[k].m_Value)
{
k = j;
}
}
if (k != i)
{
temp = piArray[k].m_Value;
piArray[k].m_Value = piArray[i].m_Value;
piArray[i].m_Value = temp;
}
}
}
/*
*输出最高的安全线
*/
void showHighL()
{
size_t suffix = adjustm_Sum();
size_t i = findMinAvgPiIndex(suffix-1);
printf("%d \n\n", piArray[i].m_Value/piArray[i].m_Sum);
}
void function()
{
while (getConsoleInputs())
{
sort();
showHighL();
}
}
int main(void)
{
function();
return 0;
}