51nod-1093 骆驼和香蕉

42 篇文章 0 订阅

基准时间限制: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 ,sum=n;

对于 n>k,由终点至起点从0-n编号,那么在 m点肯定是有m个香蕉的,之后则需要设立补给点,在第一个补给点p1到m点距离为d1,则p1到m点只需要运送两次时p1点的香蕉树最大为s1=m+3d1<=2m; 则d1<=m/3,p1=m+d1; 在p2到p1的距离为d2,需运送三次,则s2=s1+5d2=2m+5d2<=3m,则d2<=m/5,p2=p1+d2=m+d1+d2;则当pi+(2*i+1)di> n时,在计算出 n到pi这段距离需要多少香蕉即可。

Code :

#include<iostream>
using namespace std;

int n,m,sum;

int main()
{
	ios::sync_with_stdio(false);
    cin>>n>>m;
    if(n>m){//补给点可以不在整数点上 
		n-=m;	sum=m;
		double si=0,t=3;
		while(si+m/t<n){
			si+=m/t;
			t+=2;	sum+=m;
		}
		sum+=(n-si)*t+0.999999;
	}else	sum=n;
    cout<<sum<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值