1. 程式人生 > >Codeforces Round #380 (Div. 2,) C C. Road to Cinema

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

容量 int pri 分鐘 cnblogs 思路 pre scan end

題意: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 }

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