CF 702D Road to Post Office

来源:互联网 发布:阿里星球windows 编辑:程序博客网 时间:2024/05/22 17:41

Description

这道题目是讲想在A想去一个城市,这个城市距离A所处的地方距离为d。A有一辆车,但这辆车每开k的距离就会熄火,熄火后A要用t的时间去维修。值得注意的是,这辆车一开始时维修好的。A的车每开1的距离需要的时间为a。另外,A也可以选择在任何一个地方下车,然后徒步走向终点,这徒步走1的距离为b(b>a)。问A到这个城市的最小时间为多少。

Data Constraint

d,k<=1012,a,b,t<=106

Solution

我们发现A的最优选择显然是在开完一段路之后直接弃车徒步……然后我们会发现:对于一段长度为k的距离,A除弃车以外所用的时间实为t+a*k,而徒步的时间为b *k。假设我们发现(b*k>t+a *k),那么一开始就没必要开车。然后我们考虑最后一段路(d Mod k)这段路有没有必要修车之后开车走,还是徒步走完。简单判断一下就好。特别的,如果(k>=d),那么直接开车走完,连修车都不用就好了。

代码

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<algorithm>#define ll long longusing namespace std;ll d,k,a,b,t,i,j,l,x,y,p;ll pan(ll x,ll y){    if (x%y) return x/y;return x/y-1;}int main(){    scanf("%lld%lld%lld%lld%lld",&d,&k,&a,&b,&t);    if (d>k){        if (a*k+t>=b*k) p=a*k+(d-k)*b;        else {            x=pan(d,k);            p=a*k*x+t*(x-1);            y=d-k*x;            p+=min(y*b,t+y*a);        }    }else p=a*d;    printf("%lld\n",p);}
3 0