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 }