题目描述
一辆苹果能源汽车每次最多载苹果K个,而它每走1公里要用1个苹果。现在这辆车要去到N公里以外 的地方,如果N > K,那么即使装满了苹果,也无法1次走到目的地,不过可以在中途设置一些补给点 (补给点可以任意指定,不必要为整数点),先把一些苹果运过去,下次经过时可以在这些地方进行补 给。这样一来便能走到距离 > K的地方。现在给出N和K,问走到目的地最少需要消耗多少个苹果(输 出向上取整的整数答案)。
(消耗苹果不满1个记1个,例如,消耗1.3个记为2个,消耗 2.00001 2.00001 2.00001个记为3个)
输入格式
2个整数N K,中间用空格分隔。 ( 1 < = N , K < = 10000 , N < = 5 ∗ K ) (1 <= N, K <= 10000,N <= 5 * K) (1<=N,K<=10000,N<=5∗K)
输出格式
一个整数表示最少需要消耗多少个苹果。
输入输出样例
输入 #1
68 51
输出 #1
102
输入 #2
1000 500
输出 #2
3837
输入 #3
15 11
输出 #3
24
说明/提示
数据范围
20%的数据:
N
,
K
<
=
20
N,K<=20
N,K<=20
50%的数据: $N,K<=100 $
100%的数据:
N
,
K
<
=
10000
,
N
<
=
5
∗
K
N,K<=10000,N<=5*K
N,K<=10000,N<=5∗K
样例解释
对于样例1,我们在距起点17公里处设立补给点,先在起点处载着51个苹果,把其中17个苹果送去补给 点,然后返回起点,苹果恰好用完,再载着51个苹果出发到达补给点,到补给点时已经消耗17个苹 果,再加上补给点已有的17个苹果,汽车把当前的 17 + ( 51 − 17 ) = 51 17+(51-17)=51 17+(51−17)=51个苹果载着出发到达终点,共 消耗 34 + 17 + 51 = 102 34+17+51=102 34+17+51=102个苹果
解题思路
确定了补给点之后,补给点就会将路程分成若干段,并且从终点到起点每段被车经过的次数为
1
,
3
,
5
,
7
,
9.....
1,3,5,7,9.....
1,3,5,7,9.....,因为靠近起点的一段总要比它后一段多运一趟来送补给。因此如果我们想恰好送完补给并
走到终点,两个点的距离就应为K/
i
i
i ,i指这一段被经过的次数
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
double ans,n,k,i;
int main(){
scanf("%lf%lf",&n,&k);
for(i=1;n>k/i;i+=2)
ans+=k,n-=k/i;
ans+=i*n;
printf("%d",int(ceil(ans)));
}