口袋可以装下体积总和为 m 的宝石。 一共有 n+1 种不同的宝石。第 i (1≤i≤n) 种宝石一共有 ai 颗,每一颗的体积都是 bi(保证 bi=2x,其中 x 是一个正整数,2x 表示 x 个 2 的乘积,比如说 24=2×2×2×2)。第 n+1 种宝石有无限多颗,每一颗的体积都是 1。 现在蜗蜗想用数量最少的宝石装满口袋,请求出蜗蜗最少要使用多少颗宝石。 输入格式 第一行一个正整数 test 表示数据组数。 对于每组数据,第一行两个整数 n,m。接下来 n 行,每行两个整数 ai,bi 分别表示一种宝石的数量和体积。 输出格式 对于每组数据,输出一行一个整数,表示蜗蜗最少要使用多少颗宝石。 样例输入 2 2 7 1 2 1 4 2 6 1 2 1 4 样例输出 3 2 数据规模 对于 30% 的数据,保证所有的 ai=1。 对于 100% 的数据,保证 1≤test≤105,1≤n≤31,0≤m<231,1≤ai<231,2≤bi<231,bi 已经从小到大排好序了并且两两不同。
时间: 2024-04-18 17:25:17 浏览: 136
java代码-使用java解决1!+2!+……+N!的源代码
5星 · 资源好评率100%
根据题目描述,这段代码是解决"口袋可以装下体积总和为 m 的宝石"问题的程序。它包含一个外层循环,首先读取测试数据的数量 test,然后对于每组测试数据进行处理。
在每组测试数据中,首先读取宝石的种类数量 n 和口袋的体积总和 m。然后使用一个循环读取每种宝石的数量 ai 和体积 bi。接下来是一个 while 循环,当口袋的体积 m 不为 0 时执行循环。
在循环中,从最后一种宝石开始遍历到第一种宝石。对于每种宝石,计算它的体积和数量的乘积 c=a[j]*b[j]。如果口袋的体积 m 大于等于 c,就将该种宝石的数量 a[j] 加到最终结果 q 中,并更新口袋的体积 m=m-c。否则,当该种宝石的数量 a[j] 不为 0 且口袋的体积 m 大于等于 0 时,将该种宝石的数量 a[j] 逐渐减少,并将结果 q 自增,同时更新口袋的体积 m=m-b[j]。
在 while 循环结束后,如果口袋的体积 m 不为 0,则将剩余的体积m转化为第一种宝石(体积为1)的数量,并加到最终结果 q 中。
最后,输出结果 q。
以上是这段代码的大致思路和逻辑。如果还有其他问题,请随时提出。
阅读全文