360笔试编程题——20年9月26日
题目描述
搬家公司正在帮助一家人将小物体装箱。一个箱子的大小是有限的,
公司可以把一个箱子分成最多k个独立的隔间,
将一个箱子分成r个隔间需要r - 1个隔板
(这一个箱子没有放隔板也拥有一个本身的隔间)。
而这一次搬家工作只携带了b个隔板。
在每一个隔间中,由于物件放多了容易损坏,最多只能放v个物体。
现在这家人有a个物体,请问最少需要多少个箱子,才能将所有的物体装箱?
输入描述
多组数据,每一行一组数据包含4个数,a, b, k, v, 空格隔开
输出描述
输出包含一个数,即最少的箱子数
示例
样例输入
10 3 2 1
10 3 2 2
样例输出
7
3
提示
范围:1<=a,b,k,v<=100000,数据组数不会超过1000组
样例解释:
对于样例1,第1,2,3个箱子分成两个隔间,使用掉了3个隔板,
装了6个物件。第4,5,6,7个箱子没有使用隔板,装了4个物件。
共7个箱子装完了所有物件。
对于样例2,第1,2个箱子分成两个隔间,使用掉了2个隔板,装了8个物件,
最后两个物件装在第三个箱子中。
限制
时间限制: 1000MS
内存限制: 262144KB
代码
#include <iostream>
using namespace std;
class solution {
public:
void finda(int a, int b, int k, int v) {
int ans = 0, s = 0;
if (b < (k - 1)) { s = (b + 1)*v;}
else {s = k * v; }
while (a >= s) {
ans += 1;
a -= s;
//一个箱子最大存储量
if (b == 0) { s = v; }
else if (b < (k - 1)) { s = (b + 1)*v; b = 0; }
else { b -= k - 1; s = k * v; }
}
ans = ans + 1;
cout << ans << endl;
}
};
int main() {
int a, b, k, v;
while (cin >> a >> b >> k >> v) {
if (a >= 1 && a <= 100000) {
if (b >= 1 && b <= 100000) {
if (k >= 1 && k <= 100000) {
if (v >= 1 && v <= 100000) {
solution s;
s.finda(a, b, k, v);
}
}
}
}
}
system("pause");
return 0;
}