枚举
7,2
7,3
7,5
7,4
5,4
共5种
当字串长度为0时
有1种情况
当字串长度为1时
有9种情况
共1 + 9 + 8 + … + 1 = 46
在最坏情况下,B中除了最后一个数,每个数都会比较2次,共 2n - 2次,最后一个数只比较1次,所以结果为2n - 1次
每4轮转一圈,第2017轮刚好是从第二象限水平向右走到第一象限,此时:
x=[
2017
/
2
2017/2
2017/2]+1,y=[
2017
/
2
2017/2
2017/2]
#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;
}
二分搜索求切割出m条长度相同的绳段的最大长度。
加所有绳子的长count+=len[i]
如果绳子的总长度<m,那么不可能分割 ount<m
二分搜索条件,lbound<rbound
当>=m的情况都可行,要左边区间的最大值,二分模板2,(lbound+rbound+1)/2。
累加分割的绳子数量,答案:count+=len[i]/m。