codeforces738C

来源:互联网 发布:卖汉服的淘宝店 编辑:程序博客网 时间:2024/05/29 16:17

点击打开链接

题意:

       

思路: 

    一个车能不能选只和它的油箱容量有关,所以按照油箱排序,找到一个合适的最小容量即可,再求一下最优即可。

#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 longusing 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;}

原创粉丝点击