51nod-1093:骆驼和香蕉

基准时间限制:1 秒 空间限制:131072 KB 分值: 40  难度:4级算法题
 收藏
 关注
一只骆驼每次最多负重K只香蕉,而它每走1公里要吃掉1只香蕉,不吃完不肯走。现在这只骆驼要去到N公里以外的地方,如果N > K,那么即使骆驼装满了香蕉,也无法1次走到目的地,不过骆驼可以在中途设置一些补给点,先把一些香蕉运过去,下次经过时可以在这些地方进行补给。这样一来便能走到距离 > K的地方。现在给出N和K,问骆驼走到目的地最少需要消耗多少香蕉。

Input
2个整数N K,中间用空格分隔。(1 <= N, K <= 10000,N <= 5 * K)
Output
输出最少需要消耗多少根香蕉。
Input示例
1000 500
Output示例
3837


题解:

对于n<k,香蕉可以一步送到这个就不用说了,当n>k时香蕉不可能一步送到,那怎么办?就需要一个“中转

站”来储存香蕉,那么中转站的位置该怎么选?

------很显然,我们可以将问题转化一下:如何将k根香蕉运送到a点?其中a==n-k,我们假设a比较小以至于刚

刚只需要一个补给点a且只来回一次,这样在路途中总消耗的香蕉为3*a个,因为最终a点要有k根香蕉,且骆驼每次

运输量至多为k,所以有k+3*a<=2*k → a<=k/3,(其中k+3*a便是答案)显然当a<=k/3刚好满足假设中的要求,

也就是说n>k+k/3时就需要2个中转站且来回两次了

------如果n>k+k/3怎么办?可以将问题继续转化,如何将k+3*(k/3)(==2*k)根香蕉运送到b点?其中b==n-k-k/3!

同样假设只需要两个补给点a和b且只来回两次,根据上面的套路仍可列方程2*k+5*b<=3*k → b<=k/5 (其中2*k+5*b

便是答案)

……两个中转点还不够!继续转化:如何将2*k+5*(b/5)(==3*k)根香蕉运送到c点? 同理有方程

3*k+7*c<=4*k(其中3*k+7*b便是答案)

……

如果一直这样循环下去,则说明不可能送到!否则总有解,答案便是x*k+(2*x+1)*pi,其中pi表示第pi个中转站

与起点间的距离



#include<stdio.h>
#include<algorithm>
using namespace std;
int main(void)
{
	double n, k, tis, ans;
	scanf("%lf%lf", &n, &k);
	ans = 0, tis = 1;
	while(n-k/tis>=0)		/*枚举需要中转的次数,k/tis为每多一个中转站可以多运送的距离!*/
	{
		n -= k/tis;
		ans += k;
		tis += 2;
	}
	if(n>0)
		ans += n*tis;
	printf("%.0f\n", ceil(ans));
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值