NOIP 2017 普及组初赛试题_完善程序 4.2:切割绳子
(切割绳子) 有 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
*/