(切割绳子) 有 n 条绳子,每条绳子的长度已知且均为正整数。

绳子可以以任意正整数长度切割,但不可以连接。

现在要从这些绳子中切割出 m 条长度相同的绳段,求绳段的最大长度是多少。

(第一、二空 2.5 分,其余 3 分)

输入:

第一行是一个不超过 100 的正整数 n,

第二行是 n 个不超过10^6的正整数,表示每条绳子的长度,

第三行是一个不超过10^8的正整数 m。



输出:绳段的最大长度,若无法切割,输出 Failed。


#include using namespace std;

int n, m, i, lbound, ubound, mid, count;

int len[100]; // 绳子长度

int main()

{

cin >> n;

count = 0;

for (i = 0; i < n; i++)

{

//第i条绳子长度

cin >> len[i];


//计算所有的绳子的长度

count+=len[i] //①;

}


//m 条长度相同的绳段

cin >> m;


//因为m为整数,最小为1,那么如果count的值比m都小,

//就是所有的绳子截成长度为最小值1的绳子,那么数量也不够m条

if ( count < m /*②*/)

{

cout << "Failed" << endl;

return 0;

}


lbound = 1;

//第二行是 n 个不超过10^6的正整数,表示每条绳子的长度,

ubound = 1000000;//1*10^6

while ( lbound<ubound /*③*/)

{

mid =(lbound+ubound+1)/2 // ④;

count = 0;

for (i = 0; i < n; i++)

count=count+len[i]/mid //⑤;


if (count < m)

ubound = mid - 1;

else

lbound = mid;

}

cout << lbound << endl;


return 0;

}

/*

1.正确答案: count=count+len[i] / count+=len[i]

2.正确答案: count<m / m>count

3.正确答案: lbound<ubound / ubound>lbound

4.正确答案: (lbound+ubound+1)/2 / (lbound+ubound+1)>>1 / (lbound+ubound)/2+1

5.正确答案: count=count+len[i]/mid / count+=len[i]/mid

*/