codeforces-Ed82-D
七月 08, 2020
题意
你有一个 n 码的袋子,你还有 m 个盒子,第 i 个盒子的尺寸是 ai ,这里的每一个
ai 都是 2 的非负幂整数。
你可以把盒子分成大小相等的两部分。你的目标是完全装满袋子。
例如 n=10,a=[1,1,32] ,那么你必须把 32 码的盒子分成 16 码的两部分,然后把
16 码的盒子分开,你可以用 1 码,1 码,8 码的盒子装满袋子。
///被分割出来的16码 8码还有剩下的并不是直接扔掉
计算填充尺寸为 n 的袋子所需的最小分割数。
多组数据,无解输出 -1 。
先来讨论一下 -1 的情况:
考虑到分裂一个数不会影响到所有数的和。
那么我们将所有数都分裂成 1 ,由于和不变,此时 1 的个数为 ∑(i=1to m) a[i] ,
也就是说小于等于 ∑(i=1to m) a[i] 的数都可以被填出来。
故当 n>∑(i=1to m) a[i] 时,无解。
将 n 二进制拆分成 2^{k1}, 2^{k2},…, 2^{kc} 。
然后从低位(2^{k1} )到高位(2^{kc})贪心填数。
假设我们当前处理到的数为 2^ki 。
首先考虑位数小于等于 ki 的所有数中,能不能凑成 2^ki ,若可以,直接填上去;否则考虑分裂位数大于 ki 的所有数中最小的那一个,使其经过若干次分裂,分裂成 2^ki 。
1 |
|
查看评论