Codeforces Round #380 (Div. 2) C. Road to Cinema 二分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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); } |
以上是关于Codeforces Round #380 (Div. 2) C. Road to Cinema 二分的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #380 (Div. 2) 总结分享
Codeforces Round #380 Div.2 F - Financiers Game
Codeforces Round #380 (Div. 2) C. Road to Cinema 二分
Codeforces Round #380 (Div. 2,) C C. Road to Cinema