口袋可以装下体积总和为 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 已经从小到大排好序了并且两两不同。 c++不用vector不用动态规划 时间限制1秒 空间限制1024MB
时间: 2024-04-18 10:30:13 浏览: 69
c语言求1+2+...+n的解决方法
你可以尝试使用贪心算法来解决这个问题。
首先,我们将所有宝石按照体积从小到大排序。
然后,我们从最小的宝石开始,次判断能否放入口袋中。如果能放入,我们就将宝石放入口袋,并将宝石的数量加到结果中。如果不能放入,我们就放弃该宝石,并判断下一个宝石。
具体的实现如下:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 35;
struct Gem {
int num;
int volume;
};
bool compare(Gem a, Gem b) {
return a.volume < b.volume;
}
int main() {
int test;
cin >> test;
while (test--) {
int n, m;
cin >> n >> m;
Gem gems[MAXN];
for (int i = 1; i <= n; ++i) {
cin >> gems[i].num >> gems[i].volume;
}
sort(gems + 1, gems + n + 1, compare);
int result = 0;
for (int i = 1; i <= n; ++i) {
if (gems[i].volume <= m) {
int count = min(gems[i].num, m / gems[i].volume);
result += count;
m -= count * gems[i].volume;
}
}
cout << result << endl;
}
return 0;
}
```
上述代码使用了贪心算法,时间复杂度为 O(nlogn),其中 n 是宝石的种类数。我们首先对宝石按照体积进行排序,然后依次判断每个宝石是否能放入口袋中,直到口袋装满或者所有宝石都判断完毕。最后输出结果。
希望对你有帮助!
阅读全文