题目大意:
给你一个长度为D的路程,有两种行进方式,一种是选择用车行进,但是车子每行进K长度的路程之后,就会坏掉,如果想继续使用,就要用t时间去修复。
车子行进1单位要用a时间,步行1单位要用b时间,随时都可以弃车开始选择步行,问最短时间到达目的地。
思路:
1、首先将问题分成两种情况:
①d<k
②d>=k
对于第①种情况,也就是不需要修车子就可以选择车子驾驶到终点的话,那么output=min(d*a,d*b);题目中保证了a<b.,那么答案一定是d*a;
2、然后考虑第②种情况,我们首先肯定一点,如果我们修了一次车的话,车子肯定要行进k单位长度是最优的,因为修完一次车子之后 ,在k单位内,车子行进一定是快于步行的。
那么问题关键就锁定在了修车子上来。
那么对于这种大情况,我们还可以分出来三种小情况,逐个分析:
①从起点到位子K用车,剩下部分就步行了。
②从起点到位子d/k*k用车,剩下部分用步行。
③从起点到终点都用车。
对于三种情况分别计数取最小即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define ll __int64
int main()
{
ll d,k,a,b,t;
while(~scanf("%I64d%I64d%I64d%I64d%I64d",&d,&k,&a,&b,&t))
{
if(d<k)
{
if(d*a<=d*b)printf("%I64d\n",d*a);
else printf("%I64d\n",d*b);
}
else
{
ll output;
output=d*b;
// one;
output=min(output,k*a+(d-k)*b);
// two;
ll contz=d/k;
ll yu=d%k;
ll tmp=(contz-1)*t+contz*k*a;
tmp+=yu*b;
output=min(output,tmp);
//three
ll tmp2=(contz)*t+contz*k*a;
tmp2+=yu*a;
output=min(output,tmp2);
printf("%I64d\n",output);
}
}
}