CodeForces 738C Road to Cinema

二分答案。

油量越多,显然通过的时间越少。可以二分找到最小的油量,可以在$t$时间内到达电影院。

一个油箱容量为$v$的车通过长度为$L$的路程需要的最小时间为$max(L,3*L-v)$。计算过程如下:

假设普通速度运行了距离$a$,加速运行了距离$b$,则$a+b=L$,即$b=L-a$。

因为$a+2*b≤v$,所以$a≥2*L-v$。所花时间为$2*a+b≥3*L-v$,因为最小需要$L$的时间,所以取个$max$。按照$max(L,3*L-v)$一段一段加起来验证就可以了。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0);
void File()
{
    freopen("D:\in.txt","r",stdin);
    freopen("D:\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar();
    x = 0;
    while(!isdigit(c)) c = getchar();
    while(isdigit(c))
    {
        x = x * 10 + c - '0';
        c = getchar();
    }
}

struct X
{
    long long c,v;
}p[200010];
int n,k;
long long s,t,g[200010];
int f[200010];

bool cmp(X a, X b)
{
    return a.v<b.v;
}

bool check(long long x)
{
    long long tt=0;
    for(int i=0;i<k;i++)
    {
        long long len=g[i+1]-g[i];
        tt=tt+max(len,3*len-x);
    }
    if(tt<=t) return 1;
    return 0;
}

int main()
{
    cin>>n>>k>>s>>t;
    for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i].c,&p[i].v);
    for(int i=1;i<=k;i++)scanf("%lld",&g[i]);

    g[0]=0; g[k+1]=s; k++;
    sort(g,g+1+k);
    sort(p+1,p+1+n,cmp);

    long long mxlen=g[1]-g[0];
    for(int i=0;i<=k-1;i++)
    {
        long long len=g[i+1]-g[i];
        mxlen=max(mxlen,len);
    }

    long long INF=0x7FFFFFFF; INF=INF*INF;

    long long L=mxlen,R=1000000000,limit=-1;

    while(L<=R)
    {
        long long mid=(L+R)/2;
        if(check(mid)) limit=mid,R=mid-1;
        else L=mid+1;
    }

    if(limit==-1) printf("-1
");
    else
    {
        long long mn=INF;
        for(int i=1;i<=n;i++)
        {
            if(p[i].v<limit) continue;
            mn=min(mn,p[i].c);
        }
        if(mn==INF) printf("-1
");
        else printf("%lld
",mn);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/6393012.html