#10772. 分治算法(NOIP2017)切割绳子

分治算法(NOIP2017)切割绳子

(NOIP2017)切割绳子

有n条绳子,每条绳子的长度已知且均为正整数。绳子可以任意正整数长度切割,但不可以连接。现在要从这些绳子中切割出m条长度相同的线段,求绳段的最大长度是多少。

输入:第一行是一个不超过100的正整数n,第二行是n个不超过10^6的正整数,表示每条绳子的长度,第三行是一个不超过10^8的正整数m。

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

#include<iostream>
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++) {
        cin>>len[i];
        ①;
    }
    cin>>m;
    if(②) {
        cout<<"Failed"<<endl;
        return 0;
    }
    lbound=1;
    ubound=1000000;
    while(③) {
        mid=④;
        count=0;
        for(i=0;i<n;i++)
            ⑤;
        if(count<m)
            ubound=mid-1;
        else
            lbound=mid;
    }
    cout<<lbound<<endl;
    return 0;
}

①处应填( )。
{{ select(1) }}

  • count+=len[i]
  • count+
  • count=count*10+len[i]

②处应填( )。
{{ select(2) }}

  • count==m
  • count<m
  • count>m
  • count!=m

③处应填( )。
{{ select(3) }}

  • count=m
  • lbound=ubound
  • lbound<ubound
  • lbound>ubound

④处应填( )。
{{ select(4) }}

  • (lbound+ubound+1)/2
  • (lbound+ubound-1)/2
  • (ubound-lbound+1)/2
  • (lbound+ubound+1)

⑤处应填( )。
{{ select(5) }}

  • count+=len[i]/mid
  • count=(count+len[i])/mid
  • count+=len[i]/lbound
  • count=(count+len[i])/ubound