360笔试编程题——20年9月26日

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值