CF2.C(二分贪心)

本文介绍了一个租车到电影院的问题,需要在限定时间内抵达,并选择一辆租金最低且能按时到达的车。文章详细解析了如何通过二分查找的方法确定所需油箱容量,并最终选出最合适的车辆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C. Road to Cinema
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Vasya is currently at a car rental service, and he wants to reach cinema. The film he has bought a ticket for starts in t minutes. There is a straight road of length s from the service to the cinema. Let's introduce a coordinate system so that the car rental service is at the point 0, and the cinema is at the point s.

There are k gas stations along the road, and at each of them you can fill a car with any amount of fuel for free! Consider that this operation doesn't take any time, i.e. is carried out instantly.

There are n cars in the rental service, i-th of them is characterized with two integers ci and vi — the price of this car rent and the capacity of its fuel tank in liters. It's not allowed to fuel a car with more fuel than its tank capacity vi. All cars are completely fueled at the car rental service.

Each of the cars can be driven in one of two speed modes: normal or accelerated. In the normal mode a car covers 1 kilometer in 2 minutes, and consumes 1 liter of fuel. In the accelerated mode a car covers 1 kilometer in 1 minutes, but consumes 2 liters of fuel. The driving mode can be changed at any moment and any number of times.

Your task is to choose a car with minimum price such that Vasya can reach the cinema before the show starts, i.e. not later than in t minutes. Assume that all cars are completely fueled initially.

Input

The first line contains four positive integers n, k, s and t (1 ≤ n ≤ 2·105, 1 ≤ k ≤ 2·105, 2 ≤ s ≤ 109, 1 ≤ t ≤ 2·109) — the number of cars at the car rental service, the number of gas stations along the road, the length of the road and the time in which the film starts.

Each of the next n lines contains two positive integers ci and vi (1 ≤ ci, vi ≤ 109) — the price of the i-th car and its fuel tank capacity.

The next line contains k distinct integers g1, g2, ..., gk (1 ≤ gi ≤ s - 1) — the positions of the gas stations on the road in arbitrary order.

Output

Print the minimum rent price of an appropriate car, i.e. such car that Vasya will be able to reach the cinema before the film starts (not later than in t minutes). If there is no appropriate car, print -1.

Examples
Input
3 1 8 10
10 8
5 7
11 9
3
Output
10
Input
2 2 10 18
10 4
20 6
5 3
Output
20
Note

In the first sample, Vasya can reach the cinema in time using the first or the third cars, but it would be cheaper to choose the first one. Its price is equal to 10, and the capacity of its fuel tank is 8. Then Vasya can drive to the first gas station in the accelerated mode in 3 minutes, spending 6 liters of fuel. After that he can full the tank and cover 2 kilometers in the normal mode in 4 minutes, spending 2 liters of fuel. Finally, he drives in the accelerated mode covering the remaining 3 kilometers in 3 minutes and spending 6 liters of fuel.

题意:

有n辆车,每辆车有租金和邮箱的容量,路上有k个加油站,道路总长s,要求在t时间内到达终点,问选哪辆车可以以最少的租金在规定时间内到达,加油站加油不要钱,最后一行给出加油站的位置。

代码:

 1 //直接找会在第31组样例TE,卡了好久。二分油箱,找到一个最小的油箱容量能够走完全程,汽车排序后找到第一个大于等于该容量的汽车即可
 2 //二分啊,每次都想不清楚,写不对!
 3 #include<bits\stdc++.h>
 4 using namespace std;
 5 struct Lu
 6 {
 7     int r,v;
 8 }L[200005];
 9 int com[200005];
10 int n,k,s,t;
11 bool cmp1(Lu x,Lu y)
12 {
13     return x.r<y.r;
14 }
15 bool cmp2(int x,int y)
16 {
17     return x<y;
18 }
19 int check(long long mid)
20 {
21     int m=0,now=0,st=t;
22     while(m<k)
23     {
24         if(com[m]-now>mid||com[m]-now>st)
25             return 0;
26         long long tem=mid-(com[m]-now);//剩余多少油就说明可以有多少路高速行驶
27         if(tem>com[m]-now)
28             tem=com[m]-now;
29         st-=(tem+2*(com[m]-now-tem));
30         now=com[m];
31         m++;
32     }
33     if(s-now>mid||s-now>st)
34         return 0;
35     long long tem=mid-(s-now);
36     if(tem>s-now)
37         tem=s-now;
38     st-=(tem+2*(s-now-tem));
39     if(st<0) return 0;
40     return 1;
41 }
42 int main()
43 {
44     scanf("%d%d%d%d",&n,&k,&s,&t);
45     for(int i=0;i<n;i++)
46         scanf("%d%d",&L[i].r,&L[i].v);
47     for(int i=0;i<k;i++)
48         scanf("%d",&com[i]);
49     sort(L,L+n,cmp1);
50     sort(com,com+k,cmp2);
51     long long lef=1,rig=2000000009,mid;
52     while(lef<=rig)
53     {
54         mid=(lef+rig)/2;
55         if(check(mid))
56             rig=mid-1;
57         else lef=mid+1;
58     }
59    // cout<<rig+1<<endl;
60     int ans=-1;
61     for(int i=0;i<n;i++)
62     if(L[i].v>=rig+1)
63     {
64         ans=L[i].r;
65         break;
66     }
67     printf("%d\n",ans);
68     return 0;
69 }

 

转载于:https://www.cnblogs.com/--ZHIYUAN/p/6123898.html

内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值