基准时间限制: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;
}