你是一位厨师,正在准备一道菜。你有一些食材需要切成小块,但是你只有一把很小的刀,不能一次切太多食材。同种类型的多块食材可以叠在一起同时切,但同时切的食材块数有限制。不同种类的食材不能叠在一起同时切。现在给你一些食材,以及每种食材需要切成的块数(每种食材一开始只有完整的一个,需要你将食材切成多块)。请你计算最少需要切多少次才能把所有食材切好。 Input 第一行是一个整数 n,表示食材的种类数量 (1 <= n <= 10^5)。 接下来 n 行,每行两个整数 ai 和 bi,表示第 i 种食材需要切成 ai 块,而你的刀每次最多可以将bi 块这种食材叠在一起同时切 ,叠在一起同时切只算做切1次(1 <= ai, bi <= 10^5)。 Output 输出一个整数,表示最少需要切多少次才能把所有食材切好。请用C++代码实现且使用scanf函数,注意用代码实现相应的限制条件,而且还需要注意编译所用时长越短越好。并且标准输出为11,给我代码
时间: 2023-06-26 14:05:47 浏览: 146
行业文档-设计装置-一种节能菜刀.zip
```
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 5;
int n, ans;
struct node {
int a, b;
}f[MAXN];
bool cmp(node x, node y) {
return x.b > y.b;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d%d", &f[i].a, &f[i].b);
}
sort(f+1, f+n+1, cmp);
for (int i = 1; i <= n; ++i) {
ans += (f[i].a + f[i].b - 1) / f[i].b; // 向上取整
if (i < n) f[i+1].a += ((f[i].a + f[i].b - 1) / f[i].b) * f[i].b - f[i].a; // 将剩余的食材传递给下一个
}
printf("%d\n", ans);
return 0;
}
```
阅读全文