题意:
思路:
一个车能不能选只和它的油箱容量有关,所以按照油箱排序,找到一个合适的最小容量即可,再求一下最优即可。
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int maxn = 2e5 + 10;
int n, k, s, t, mint;
struct node
{
int c, tank;
friend bool operator < (node a, node b)
{
return a.tank < b.tank;
}
}a[maxn];
int g[maxn];
bool check(int x)
{
int nowtank = a[x].tank;
double tx = 1.0 * mint;
for(int i = 1; i <= k; i++)
{
nowtank = a[x].tank;
int len = g[i] - g[i-1];
if(len > nowtank)
return false;
else if(nowtank > 2*len)
nowtank = 2*len;
tx = tx - 1.0*(nowtank - len);
}
nowtank = a[x].tank;
int len = s - g[k];
if(len > nowtank)
return false;
else
{
if(nowtank > 2*len)
nowtank = 2*len;
tx = tx - 1.0*(nowtank - len);
}
if(tx>0)
return false;
else
return true;
}
int main()
{
scanf("%d%d%d%d", &n, &k, &s, &t);
if(s > t)
{
cout<<-1<<endl;
return 0;
}
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &a[i].c, &a[i].tank);
}
for(int i = 1; i <= k; i++)
{
scanf("%d", &g[i]);
}
sort(a+1, a+1+n);
sort(g+1, g+k+1);
mint = t-2*(t-s);
int l = 0, r = n+1, mid;
bool flag =false;
while(l < r)
{
mid = (l+r)/2;
if(check(mid))
{
r = mid;
flag = true;
}
else
l = mid+1;
}
int minc = 2e9;
if(!flag)
{
cout<<-1<<endl;
return 0;
}
for(int i = r; i <= n; i++)
minc = min (minc, a[i].c);
printf("%d\n", minc);
return 0;
}