Codeforces 729CRoad to Cinema(二分)

Posted Gealo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 729CRoad to Cinema(二分)相关的知识,希望对你有一定的参考价值。

题目链接 http://codeforces.com/problemset/problem/729/C

题意:n个价格c[i],油量v[i]的汽车,求最便宜的一辆使得能在t时间内到达s,路途中有k个位置在g[i]的加油站,可以免费加满油,且不耗时间。每辆车有两种运行模式可以随时切换:1.每米一分钟两升油;2.每米两分钟一升油。

看到10^5次加上循环两次就想到二分或者线段树或者看错题意了。

这题二分查找一下汽油就可以了,找到最少多少汽油够到达,然后再for一遍找汽油量大的且价格便宜的车即可。

还有一些关系要注意一下的

t(min) = 不符合 (L > v[i])

          = L (2 * L <= v[i])

          = 3 * L - v[i] (L<=v[i]<2 * L)

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 2e5 + 10;
typedef long long ll;
struct TnT {
    int v , f;
}sl[M];
ll pos[M] , sp[M];
bool cmp(TnT a , TnT b) {
    return a.f > b.f;
}
int main()
{
    int n , k , s , t;
    scanf("%d%d%d%d" , &n , &k , &s , &t);
    for(int i = 0 ; i < n ; i++) {
        scanf("%d%d" , &sl[i].v , &sl[i].f);
    }
    ll le = 0;
    int temp = 0;
    for(int i = 0 ; i < k ; i++) {
        scanf("%I64d" , &pos[i]);
    }
    sort(pos , pos + k);
    for(int i = 0 ; i < k ; i++) {
        sp[temp++] = pos[i] - le;
        le = pos[i];
    }
    if(pos[k - 1] != s) {
        sp[temp++] = s - le;
    }
    sort(sl , sl + n , cmp);
    int l = 0 , r = n - 1;
    int flag;
    while(l <= r) {
        int mid = (l + r) >> 1;
        ll sum = 0;
        flag = 0;
        for(int i = 0 ; i < temp ; i++) {
            ll gg = sp[i] * 3;
            if(sl[mid].f < sp[i]) {
                flag = 1;
                break;
            }
            else {
                if(2 * sp[i] <= sl[mid].f) {
                    sum += sp[i];
                }
                else {
                    sum += (gg - sl[mid].f);
                }
                flag = 0;
            }
        }
        if(flag == 1) {
            r = mid - 1;
            continue;
        }
        if(sum > t) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    if(l - 1 == -1) {
        printf("-1\n");
    }
    else {
        int MIN = sl[l - 1].v;
        int cmper = sl[l - 1].f;
        for(int i = 0 ; i < n ; i++) {
            if(sl[i].f >= cmper) {
                MIN = min(MIN , sl[i].v);
            }
        }
        printf("%d\n" , MIN);
    }
    return 0;
}

以上是关于Codeforces 729CRoad to Cinema(二分)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #729 (Div. 2)

Codeforces Round #729 (Div. 2)

Codeforces Round #729 (Div. 2)

Codeforces_729_E

Codeforces 729D Sea Battle(简单思维题)

Sea Battle CodeForces - 729D