CodeForces-702D Road to Post Office(初中数学脑洞题)

题目链接请戳这里http://www.codeforces.com/problemset/problem/702/D
题目大意:
一个人开着一辆破车去邮局,已知距离为d,这辆车每开k(距离)会坏一次,每次修好要等t,已知每走1距离,开车用时为a,步行用时为b。求最短时间。

题目分析:
这种题如果给出这五个数的值应该就是一道小学(初中)应用题了。既然是以代数式出现,那就分情况讨论一下。
首先如果 dk ,直接开过去就好了,否则先开k距离,再讨论一下。(因为已知开车比走得快,所以刚上来肯定先开车)
这时候设剩下的距离为d’,显然有d’=d-ka.把d’分为T个周期,每个周期为k,剩余距离为r。即令d’=kT+r,显然每个周期里面有两种选择:(1)先等车修好,再把车开坏,用时为 t+ka ;(2)走过去,用时为 kb
如果 kb<t+ka ,说明走过去划算,那么就直接走到终点,用时 db (因为这里隐含了 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值