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

题意:n,k,s,t,n种车,k个加油站,s距离,t时间,问你是否能选一个最便宜的车,从0到s在t时间内,2种速度,1km/1L油/2分钟和1km/2L油/1分钟,路过加油站可加满油并且不耗时间,给出每辆车的c,v,代表租金和油箱容量

思路:2分油的容量。即该容量能否在t时间到达,最后再>=该容量的挑个租金最少的

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=200005;
 5 
 6 int n,k,s,t;
 7 struct node{
 8     int c,v;
 9 }a[N];
10 int b[N];
11 
12 int check(int x){
13     int len=b[1];
14     int tt=0;
15     int t2=min(len,x-len),t1=len-t2;
16     //t2代表用快速开车的距离,t2即用慢速开车距离
17     if(t2<0) return 0;
18     tt+=t1*2+t2;
19     for(int i=2;i<=k;i++){
20         len=b[i]-b[i-1];
21         t2=min(len,x-len),t1=len-t2;
22         if(t2<0) return 0;
23         tt+=t1*2+t2;
24     }
25     len=s-b[k];
26     t2=min(len,x-len),t1=len-t2;
27     if(t2<0) return 0;
28     tt+=t1*2+t2;
29     if(tt<=t) return 1;
30     return 0;
31 }
32 
33 bool cmp(node p,node q){
34     return p.v<q.v;
35 }
36 
37 int main(){
38     scanf("%d%d%d%d",&n,&k,&s,&t);
39     int l=0,r=-1,mid,ans=-1;
40     for(int i=1;i<=n;i++){
41         scanf("%d%d",&a[i].c,&a[i].v);
42         r=max(r,a[i].v);
43     }
44     for(int i=1;i<=k;i++) scanf("%d",&b[i]);
45     sort(b+1,b+1+k);
46     //mid代表该容量的油箱能不能t时间到达//
47     while(l<=r){
48         mid=(l+r)>>1;
49         if(check(mid)){
50             ans=mid;
51             r=mid-1;
52         }
53         else l=mid+1;
54     }
55     //cout<<ans<<endl;
56     if(ans==-1) {
57         printf("-1\n");return 0;
58     }
59     sort(a+1,a+1+n,cmp);
60     int Min=1e9+1000;
61     for(int i=1;i<=n;i++){
62         if(a[i].v>=ans){
63             Min=min(Min,a[i].c);
64         }
65     }
66    printf("%d\n",Min);
67 }

 

posted on 2017-08-14 13:43  hhhhx  阅读(142)  评论(0编辑  收藏  举报

导航