Codeforces Round #422 (Div. 2) C. Hacker, pack your bags!

第一次两个小时内做三道题。。不过比赛结束重测后,这题超时了这里写图片描述
我是按照r-l+1升序排序,如果r-l+1相等,则按照cost升序排序。然后从头扫一遍,扫的时候二分查找到与当前的duration1相加等于x的那个duration2,然后再把符合条件的duration2扫一遍。因为cost升序排序,所以一旦找到符合条件的duration2,后边的就不用管了。这是我思路。。。。
我看了下别人提交的代码,找了好几个才找到一个用二分做的:按照r-l+1升序排序,如果r-l+1相等,按照r升序排序。然后直接二分搜索确定到具体的花费。具体看代码。。

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int l,r,cost,der,mincost;
};
const int MAXN = 2e5+10;
node ns[MAXN];
int n,x;

bool cmp(const node& a, const node& b)
{
    if(a.der == b.der)
        return a.r < b.r;
    return a.der < b.der;
}

int BS(int l, int r, int rp)
{
    int mid;
    int ans = INT_MAX;
    while(l <= r)
    {
        mid = (l+r) >> 1;
        if(ns[rp].der+ns[mid].der < x)
            l = mid+1;
        else if(ns[rp].der + ns[mid].der == x)
        {
            if(ns[rp].l <= ns[mid].r)
                r = mid-1;
            //ns[rp].l > ns[mid].r
            else
            {
                l = mid+1;
                ans = min(ans,ns[rp].cost+ns[mid].mincost);
            }
        }
        else
            r = mid-1;
    }
    return ans;
}


int main()
{
    scanf("%d %d",&n,&x);
    for(int i = 0; i < n; ++i)
    {
        scanf("%d %d %d",&ns[i].l,&ns[i].r,&ns[i].cost);
        ns[i].der = ns[i].r - ns[i].l + 1;
        ns[i].mincost = ns[i].cost;
    }
    sort(ns,ns+n,cmp);
    for(int i = 0; i < n; ++i)
    {
        if(i > 0 && ns[i].der == ns[i-1].der)
            ns[i].mincost = min(ns[i].mincost,ns[i-1].mincost);
    }
    int ansCost = INT_MAX;
    for(int i = 0; i < n; ++i)
        ansCost = min(BS(0,n-1,i),ansCost);
    if(ansCost == INT_MAX)
        printf("-1\n");
    else
        printf("%d\n",ansCost);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值