版主太客气了,每次都给评分
不过,楼上的代码仍然过不了一些特殊的数据。
比如:
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; }