Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 思维排序或二分

STM32CubeMX Nucleo F767ZI 教程(1) 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod 阅读详情

题目:http://codeforces.com/contest/822/problem/C

题意:给多个区间,每个区间都有一个权值,求两个长度和为x的区间的最小权值和。

思路1:像这种找两个区间的问题,对于每个区间只需考虑在他左面的或只需考虑在他右面的即可,不需要都考虑,就像区间1 区间2 和区间2 区间1 效果是一样的

维护一个need【i】表示长度为i的区间的最小权值,至于如何保证区间不交,控制一下维护顺序即可,对原区间按左端点从小到大排序,1->n遍历一遍,设当前区间左端点l,右端点r,权值c,因此长度为r-l+1,这时need【i】表示的通过所有右端点小于l的区间(也就是在此区间左边的区间)维护后的值,控制这个维护的顺序可以用优先队列实现,也可以直接排序,还有一种方法就是以右端点为索引保存这个区间,遍历即可。

优先队列写法:171ms

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int le,ri,cost;
    bool operator < (const node u)const
    {
        return ri>u.ri;
    }
}num[200005];
int need[200005];
int cmp(node u,node v)
{
    if(u.le==v.le)
        return u.ri<v.ri;
    return u.le<v.le;
}
priority_queue<node>q;
int main()
{
    int i,n,x,l,r,c,ban;
    cin>>n>>x;
    for(i=0;i<n;i++)
    scanf("%d %d %d",&num[i].le,&num[i].ri,&num[i].cost);
    sort(num,num+n,cmp);
    int minn=2e9+2;
    for(i=0;i<n;i++)
    {
        int now=num[i].ri-num[i].le+1;
        if(now>=x)
            continue;
        if(need[x-now])
        minn=min(minn,need[x-now]+num[i].cost);
        q.push(num[i]);
        if(i!=n-1)
        while(!q.empty())
        {
            node t=q.top();

            if(t.ri>=num[i+1].le)
                break;
            q.pop();
       //     cout<<t.le<<" "<<t.ri<<" "<<t.cost<<endl;
            if(need[t.ri-t.le+1])
            need[t.ri-t.le+1]=min(need[t.ri-t.le+1],t.cost);
            else
            need[t.ri-t.le+1]=t.cost;
        }
    }
    if(minn==2e9+2)
        cout<<-1<<endl;
    else
    cout<<minn<<endl;
    return 0;
}

排序写法:171ms

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int le,ri,cost;
}num[200005],again[200005];
int need[200005];
int cmp(node u,node v)
{
    if(u.le==v.le)
        return u.ri<v.ri;
    return u.le<v.le;
}
int cmp2(node u,node v)
{
    return u.ri<v.ri;
}
int main()
{
    int i,n,x,l,r,c,ban;
    cin>>n>>x;
    for(i=0;i<n;i++)
    scanf("%d %d %d",&num[i].le,&num[i].ri,&num[i].cost),again[i]=num[i];
    sort(num,num+n,cmp);
    sort(again,again+n,cmp2);
    int minn=2e9+1;
    int index=0;
    for(i=0;i<n;i++)
    {
        int now=num[i].ri-num[i].le+1;
        if(now>=x)
            continue;
        if(need[x-now])
        minn=min(minn,need[x-now]+num[i].cost);
        if(i!=n-1)
        while(again[index].ri<num[i+1].le)
        {
            now=again[index].ri-again[index].le+1;
            if(need[now])
                need[now]=min(need[now],again[index].cost);
            else
                need[now]=again[index].cost;
            index++;
        }
    }
    if(minn==2e9+1)
        cout<<-1<<endl;
    else
    cout<<minn<<endl;
    return 0;
}

右端点vector记录写法:202ms(本以为这个是最优的。。。)

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int le,ri,cost;
}num[200005];
int need[200005];
int cmp(node u,node v)
{
    if(u.le==v.le)
        return u.ri<v.ri;
    return u.le<v.le;
}
vector<node>again[200005];
int main()
{
    int i,n,x,l,r,c,ban;
    cin>>n>>x;
    for(i=0;i<n;i++)
    scanf("%d %d %d",&num[i].le,&num[i].ri,&num[i].cost),again[num[i].ri].push_back(num[i]);
    sort(num,num+n,cmp);
    int minn=2e9+1,index=0;
    for(i=0;i<n;i++)
    {
        int now=num[i].ri-num[i].le+1;
        if(now>=x)
            continue;
        if(need[x-now])
        minn=min(minn,need[x-now]+num[i].cost);
        if(i!=n-1)
        for(;index<num[i+1].le;index++)
        {
            for(int j=0;j<again[index].size();j++)
            {
                now=again[index][j].ri-again[index][j].le+1;
                if(need[now])
                    need[now]=min(need[now],again[index][j].cost);
                else
                    need[now]=again[index][j].cost;
            }
        }
    }
    if(minn==2e9+1)
        cout<<-1<<endl;
    else
    cout<<minn<<endl;
    return 0;
}


思路2:二分。和上面思路整体相同,vector【i】记录长度为i的所有区间,遍历每个区间,在长度匹配的区间里二分找合适的,事先求一个权值最小后缀,优化一下即可。


记得上次去西安遇到一个和这个类似的题目,卡了很长时间都没出。现在又是想了半天也没有思路。。。。







dq轴坐标系下的电路方程 dq轴坐标系下的电路方程 dq轴坐标系是一种常见的电路方程,但是再dq轴坐标系下电路元件的电压电流dq轴存在一定的耦合,本文针对三相电路推导了dq轴坐标系下的电路电路方程进行一个推导,首先先列出来派克变换的公式 派克变换 [AdAqA0]=23[cos⁡(θ)cos⁡(θ−2π/3)cos⁡(θ+2π/3)−sin⁡(θ)−sin⁡(θ−2π/3)−sin⁡(θ+2π/3)1/21/21/2][AaAbAc]\left[\begin{array}{c}A_d\\A_q\\A_0 \end{array}\ri 阅读详情

相关推荐

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 468

Codeforces Round #822 (Div. 2) 补题 (A、B、C、D)

自己想了个解法没有写出来,缘由是一些数没有覆盖到,果然功力还是差些火候,还是大佬的写法妙啊。简单思维,要认清能到达一个房间的房间都有那些,之后发现只有塔的两侧亮了才符合要求。简单思维,一看数据范围直接三重循环(要是省赛有这么松的数据范围就好了)

qiaodxs的博客 1104

Hi3516CV610开发板实战:从零搭建智能视觉监控系统

本文详细介绍了从零开始基于Hi3516CV610开发板搭建智能视觉监控系统的完整实战流程。涵盖硬件连接、系统配置、摄像头集成、网络设置、固件烧录到视频处理与智能分析功能开发,提供了丰富的实践经验和调试技巧,帮助开发者快速掌握嵌入式视觉系统开发。

vvv99的博客 561

Codeforces Round #822 (Div. 2) 题解

题意为每一次可以选一个数加1或减1,问达到数组中有三个相等的数的最小步数签到题,可能会有很多种解法这里说其中一种我们把整个数组排序,然后对于每一个三元组,把紧邻他的前后元素改成此元素,更新答案即可代码如下。

m0_61735576的博客 1380

metaRTC嵌入式webrtc编译指南

metaRTC编译支持qmake和cmake,qmake使用QT最为方便,新版本新增了cmake支持。 ...

metaRTC的博客 9518

薛定谔虚拟筛选实战:如何用PDB文件快速构建受体格点(避坑指南)

本文提供了薛定谔虚拟筛选实战指南,聚焦于如何从PDB文件快速、精准地构建受体格点。文章详细解析了可变残基的理性处理策略、基于配体尺寸的盒子量化设置方法,并分享了高级约束与排除体积的实战技巧,旨在帮助用户避开常见陷阱,提升虚拟筛选的成功率与效率。

weixin_28419039的博客 252

【Codeforces Round #422 (Div. 2) D】My pretty girl Noora

【题目链接】:http://codeforces.com/contest/822/problem/D 【题意】 有n个人参加选美比赛; 要求把这n个人分成若干个相同大小的组; 每个组内的人数是相同的; 然后每个组内的人,两两比较; 每个组得出最美的人; 然后每个组中最美的人再重复上述步骤; 直到只剩一个人; 问你如何选定每个阶段的分组; 使得比较的次数最少

MrMrs的专栏 403

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4370

【 Codeforces Round #822 (Div. 2)-C】【倍数问题】【筛倍数法】

【代码】【 Codeforces Round #822 (Div. 2)-C】【倍数问题】【筛倍数法】

bei2002315的博客 205

【人工智能】Claude Code 安装、配置及问题排查完整指南

建议使用IDE来启动 Claude,执行后,内容如下。(确保环境可正常运行 npm 命令)。

奶爸的编程之路,也就一周冷个三天 1206

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下)

本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复杂的医疗AI系统解构为Host、MCP Server和标准协议三层,并将各类能力(临床决策、影像分析、合规审计)封装为标准的、可独立演进的Server,我们成功地构建了一个模块化、高内聚、低耦合的系统。

AllenLV的博客 1380

Codeforces Round #822 (Div. 2) F. Zeros and Ones (Thue-Morse序列 & 带进位的数位dp)

Thue-Morse序列性质 & 带进位的数位dp

小衣同学的博客 740

电源芯片MPQ3431A

MPQ3431A是一款具有宽输入范围的固定频率为450kHz的高度集成的升压转换器,其输入电压低至2.7V,采用恒定关断时间(COT)的控制拓扑,可提供快速的瞬态响应。芯片支持通过MODE管脚配置PSM(pulse-skip mode)、FCCM(forced continuous conduction mode)和USM(ultrasonic mode);还支持通过电流限制配置来达到精确的过流保护;同时芯片欠压保护(UVLO)和过温保护(OTP)。MPQ3431A采用QFN-13(3mmx4mm)封装。保

qflook的博客 1559

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

Hacker, pack your bags! time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output It's well known that the best way to distract from something is to do one's favourite thing. Job is such a thing for Leha. So

Ever_glow的博客 1959

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序+贪心

链接: http://codeforces.com/contest/822/problem/C 题意: 有x天的假期, 有n张旅行票, 每张票有起始时间l, 结束时间r, 花费cost, 想把假期分成两部分出去旅游, 两部分时间不能重合(ri &lt; lj || rj &lt; li), 问最小花费是多少, 如果不能两部分, 输出-1 题解: CF官方解法, 效率O(nlog...

花海 935

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Codeforces Round #422 (Div. 2) C】Hacker, pack your bags!(二分写法)

【题目链接】:http://codeforces.com/contest/822/problem/C 【题意】 有n个旅行计划, 每个旅行计划以开始日期li,结束日期ri,以及花费金钱costi描述; 让你在这n个旅行计划中选出两个计划; 要求这两个计划的日期没有相交的部分; 且这两个日期的总时间长度恰好为x; 让你求最小花费 【题解】 先...

324

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

C. Hacker, pack your bags! time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output It's well known that the ...

daya1239的博客 397

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

C. Hacker, pack your bags!    time limit per test    2 seconds    memory limit per test    256 megabytes    input    standard input    output    standard outputIt's well known that the best way to dis...

AlphaWA的博客 844

Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序, 贪心, 暴力(居然可以n方暴力)

题目链接: Hacker, pack your bags!题目大意有x天的假期, 有n张旅行票, 每张票有起始时间l, 结束时间r, 花费cost, 想把假期分成两部分出去旅游, 两部分时间不能重合, (ri < lj || rj < li), 问最小花费是多少, 如果不能两部分, 输出-1思路1. 排序, 贪心CF官方解法 设置一个结构体, struct P{int p, len, cost,

litmxs的博客 1593

Codeforces Round #422 C. Hacker, pack your bags! (二分)

题意有 n 个旅行行程,每个指定 l r cost ,表示该行程的出发时间,结束时间,费用,旅行的持续时间记为 r-l+1 。要求找到两个旅行行程,使得两者的持续时间和恰好为 x 。同时保证两个行程不会冲突,即需保证 ri<ljr_i < l_j 或 rj<lir_j < l_i 。在能够找到的情况下,要求找到总费用最少的方案。解题思路将旅行行程按持续时间为第一关键字从小到大,结束时间为第二关键字从

DorMOUSENone的博客 1657

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

传送门 题意 给出n个区间[l,r]及花费\(cost_i\),找两个区间满足 1.区间和为指定值x 2.花费最小 分析 先用vector记录(l,r,cost)和(r,l,cost),按l排序,再设置一个数组bestcost[i]代表长度为i的最小花费。 O(n)扫一遍,如果碰到区间左端点,更新答案;碰到右端点,更新bestcost[len],具体见代码 trick 1.更新答案会爆i...

anquan1533的博客 139

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

传送门:http://codeforces.com/contest/822/problem/C 题意:找两端互不相交的线段长度和为x 使cost最小 直接排序后二分搜对应的长度内的最小值。也可以边查询边更新对应长度最小值,复杂度相同。代码如下: 1 #define _CRT_SECURE_NO_DEPRECATE 2 #pragma comment(linker, "/STA...

weixin_33754065的博客 186

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

题目链接http://codeforces.com/contest/822/problem/C题目大意给你n个时间段,有起始日期和结束日期,用int型书表示,还有一个目标天数x, 每个时间段有一个cost值,问你从n个时间段取出两个时间段持续时间加起来正好为x,且1.cost总和最小, 2.时间段不能重叠,即ri < lj 或 rj < li;核心思想首先要想到可以用一个best[i]数组去记录i长

lin的博客 562
上一篇: 51nod 1202 子序列的个数 dp
下一篇: Codeforces Round #424 (Div. 2)C. Jury Marks 暴力 D. Office Keys 二分 E. Cards Sorting 树状数组
jerans
博客等级 码龄10年 54粉丝 255原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值