共42道题,当前是第36

Description

(最优装配问题) 有 $n$ 个盒子需要打包邮寄给同一个买家,每个盒子有一个体积,用 $ai$ 表示第 $i$ 个盒子的体积,已知若第 $i$ 个盒子的体积不超过第 $j$ 个盒子体积的一半(即 $2 \times ai \leq aj)$,就可将第 $i$ 个盒子放入第 $j$ 个盒子内一起打包,但是同一个包裹内最多装两个盒子(即不能将一个装有盒子的盒子再放入另一个盒子中),卖家希望尽可能多地将盒子合并在一起以减少打包的包裹数量。

下面的代码使用二分算法求解并输出最少打包数量,试补全代码。

1	#include 
2	#include 
3	using namespace std;
4	int n, a[1000];
5	bool check(int x) {
6	    for (int i = 1; i <= x; i++)
7	        if (2 * a[i] >  ___ (1) ___ )
8	            return false;
9	    return true;
10	}
11	int main() {
12	    cin >> n;
13	    for (int i = 1; i <= n; i++)
14	        cin >> a[i];
15	    sort(a+1,  ___ (2) ___ );
16	    int l = 0, r = n/2, mid, res;
17	    while ( ___ (3) ___ ) {
18	        mid = (l + r) / 2;
19	        if (check(mid)) {
20	            res = mid;
21	             ___ (4) ___ ;
22	        } else {
23	             ___ (5) ___ ;
24	        }
25	    }
26	    cout << n - res << endl;
27	    return 0;
28	}

1. C。解析:第 $i$ 小的应与第 $x+1-i$ 大数(即 $a[n-x+i]$)的比较。
2. C。解析:根据输入是从 $a[1]$ 输入 $a[n]$,所以排序也是给 $a[1]$ 到 $a[n]$ 排序,对应的 $sort$ 函数应写为 $sort(a+1, a+n+1)$。
3. C。解析:根据二分的写法,可知判断的区间范围是 $[l,r]$,所以二分的判断条件是 $l <= r$。
4. B。解析:因为 $check(x)$ 判断能够凑成 $x$ 对,所以当条件成立时应让 $l = mid + 1$ 以寻找更大的答案;当条件不成立是应让 $r = mid - 1$ 以寻找更小的答案。
5. C。

Question

___ (1) ___ 处应填( )

___ (2) ___ 处应填( )

___ (3) ___ 处应填( )

___ (4) ___ 处应填( )

___ (5) ___ 处应填( )

陈伦制作 版权所无 粤ICP备16127491号-1