Codeforces Round #380 (Div. 2) C. Road to Cinema 二分

题意:

1.给你n辆车,k个加油站,s路程,t秒内到达

2.所有车都有两种mode:1km / min 和 1km / 2min,耗油量是 2/km 和 1/km

3.每辆车有价格和油罐容量,路过加油站汽油可瞬间满血。求最便宜的车。

思路:

1.写一个bool函数judge,用来判断车花费最少时间mint,如果mint<=t返回真。用加油站把路程分组,每组求出mint,累加起来。

2.每组路程dis有三种情况:

A.油罐容量feul<dis,说明用慢速都到大不了,return false;

B.油罐容量fuel>=2*dis,说明直接用高速到达即可,速度是1km/min,所以mint+=dis;

C. 油罐容量介于AB之间,尽可能用高速。设高速行驶x km,低速行驶y km。

  则有x+y=dis,2x+y<=feul。

  得出x<=fuel-dis,即x的最大值为fuel-dis。mint+=x+2*y。

3.用车中的最大油罐量maxfuel走一次judge,如果不行直接输出-1。否则二分(0,maxfuel)求出能准时到达的最小油罐容量。

4.最后扫一遍车,如果车的容量大于最小容量,则res=min(res,car[i].cost);

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<iostream>
#include<algorithm>
#include<cstdio>
using  namespace  std;
const  int  maxn=200200;
struct  Car
{
     int  cost, fuel;
}car[maxn];
int  gas[maxn];
bool  judge( int  fuel, int  k, int  t)
{
     /*
         x+y=dis
         2x+y<=fuel
         so x<=fuel-dis
         x represent the distance with high speed, y ...
     */
     int  i,j;
     int  mint=0;
     for (i=1;i<=k+1;i++)
     {
         int  dis=gas[i]-gas[i-1];
         if (fuel<dis)
             return  false ;
         else  if (fuel>=2*dis)
             mint+=dis;
         else
         {
             int  x=fuel-dis;
             int  y=dis-x;
             mint+=x+2*y;
         }
     }
     return  mint<=t;
}
int  main()
{
     int  n,k,s,t,i,j;
     scanf ( "%d%d%d%d" ,&n,&k,&s,&t);
     int  maxfuel=-1;
     for (i=1;i<=n;i++)
         scanf ( "%d%d" ,&car[i].cost,&car[i].fuel),
         maxfuel=max(maxfuel,car[i].fuel);
     for (i=1;i<=k;i++)
         scanf ( "%d" ,&gas[i]);
     sort(gas+1,gas+k+1);
     gas[0]=0;
     gas[k+1]=s;
     if (!judge(maxfuel,k,t))
     {
         printf ( "-1\n" );
         return  0;
     }
     int  low,high;
     low=0,high=maxfuel;
     while (low<high)
     {
         int  mid=low+high >> 1;
         if (judge(mid,k,t))
             high=mid;
         else
             low=mid+1;
     }
     int  res=2e9+5;
     for (i=1;i<=n;i++)
         if (car[i].fuel>=low)
             res=min(res,car[i].cost);
     printf ( "%d\n" ,res);
}
    

转载于:https://www.cnblogs.com/bestwzh/p/6091240.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值