CodeForces 729C Road to Cinema

传送门:CF729C Road to Cinema
算法分析:到达终点的最小时间单调递增,即钱越多,时间越短,考虑二分,关键在于判断油箱剩余油量的操作


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxN=300000;
struct Node
{
    int c,v;
}a[maxN+1];
bool comp(Node x,Node y)
{
    if(x.v!=y.v) return x.v<y.v;
    return x.c<y.c;
}
int n,s,k,t,oil[maxN+1],ans=-1,final=2147483647;
bool check(int);
inline int read();
int main()
{
    n=read(); k=read(); s=read(); t=read();
    for(int i=1;i<=n;i++)
    {
        a[i].c=read();
        a[i].v=read();
    }
    sort(a+1,a+n+1,comp);
    for(int i=1;i<=k;i++)
        oil[i]=read();
    sort(oil+1,oil+k+1);
    k++; oil[k]=s;
    int l=1,r=n;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(check(mid)) {ans=mid; r=mid-1;}
        else l=mid+1;
    }
    if(ans==-1) printf("-1");
    else
    {
        for(int i=ans;i<=n;i++)
            final=min(final,a[i].c);
        printf("%d",final);
    }
        
    return 0;
}
inline int read()
{
    int num=0,f=1;
    char ch=getchar();
    while((ch<'0' || ch>'9') && ch!='-') ch=getchar();
    if(ch=='-') {f=-1; ch=getchar();}
    while(ch>='0' && ch<='9')
    {
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num*f;
}
bool check(int num)
{
    int ti=0,loca=0;
    for(int i=1;i<=k;i++)
    {
        int dis=oil[i]-oil[i-1];
        if(dis>a[num].v) return false;
        if(dis*2<=a[num].v) ti+=dis;
        else
        {
            int rest=a[num].v-dis;
            ti=ti+dis*2-rest;
        }
        loca+=dis;
    }
    if(ti>t) return false;
    return true;
}

猜你喜欢

转载自www.cnblogs.com/ezsyshx/p/10359326.html