本题使用贪心算法 + 最大堆。
每次切割只能把一段绳子分成长度为 ⌊x/2⌋ 和 ⌈x/2⌉ 的两段。为了优先满足较长的目标绳子,将目标数组按从大到小排序,并用最大堆维护当前的绳子。
多多手里握着一根长度为 S 的绳子。
这根绳子允许切任意多刀,也允许保持原样、一刀都不动。每一次下刀,都是挑出当前还留着的某一截,把它的长度记作 y,再顺着正中分开,得到 ⌊2y⌋ 与 ⌈2y⌉ 这两截;前一个记号会把小数部分丢掉,后一个记号只要出现小数就往前进一位。长度已经是 1 的那一截,没法再分开。
希望最后桌上正好摆着 K 截,各截长度分别是 B1,B2,…,BK。每一截都得是切出来的一整根,不能拿几截重新接上;桌上也不许多留任何一截。
请判断多多只靠这样切,能不能凑出这 K 截。
首行给出整数 Q(0<Q≤50),表示数据一共有几组。
每组占两行。前一行是两个整数 S,K(1≤S≤1014,1≤K≤105),依次表示绳子一开始有多长、想切成几截;后一行是 K 个整数 B1,B2,…,BK(1≤Bi≤109),依次表示每一截想要的长度。
一共写出 Q 行。每一行只写 YES 或 NO,表示这一组能不能切成目标绳子。
输入
3
7 3
2 2 3
6 3
2 2 2
9 2
4 6
输出
YES
NO
NO
说明
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册