题目链接请戳这里http://www.codeforces.com/problemset/problem/702/D
题目大意:
一个人开着一辆破车去邮局,已知距离为d,这辆车每开k(距离)会坏一次,每次修好要等t,已知每走1距离,开车用时为a,步行用时为b。求最短时间。
题目分析:
这种题如果给出这五个数的值应该就是一道小学(初中)应用题了。既然是以代数式出现,那就分情况讨论一下。
首先如果
d≤k
,直接开过去就好了,否则先开k距离,再讨论一下。(因为已知开车比走得快,所以刚上来肯定先开车)
这时候设剩下的距离为d’,显然有d’=d-ka.把d’分为T个周期,每个周期为k,剩余距离为r。即令d’=kT+r,显然每个周期里面有两种选择:(1)先等车修好,再把车开坏,用时为
t+ka
;(2)走过去,用时为
kb
。
如果
kb<t+ka
,说明走过去划算,那么就直接走到终点,用时
d′b
(因为这里隐含了
rb<t+ra
,说明最后的余量也是走的快,想想为什么?).否则呢,就开过去,到最后一个周期判断rb和t+ra的大小,选较小的那个。
ac代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ll d,k,a,b,t;
scanf("%I64d %I64d %I64d %I64d %I64d", &d,&k,&a,&b,&t);
ll ans=0;
if(d<=k)
ans=d*a;
else if(k*b<k*a+t)
ans=k*a+(d-k)*b;
else {
ll T=(d-k)/k,r=d-k-k*T;
ans=k*a+(k*a+t)*T+min(r*b,r*a+t);
}
printf("%I64d\n", ans);
}