D. Boris and His Amazing Haircut

2023-09-21 12:55:51

Problem - D - Codeforces

问题描述:剪发,将数组a减为数组b,有m个剪刀,每个剪刀只可以用一次且可以在任意区间内剪发,将长度大于mi的减为mi。现在有m数组,数组元素是第i个剪刀可以剪到mi,问能否将a减为b。

洛谷翻译:

image-20230921114344917

思路:一定是先减最长的,再减短的。在减的时候会将这个a数组渐渐减成多个数组,再对这些数组进行这些操作,判断给出的m数组是否满足可以进行这些操作。

如果是b[0],因为是第一个,所以一定需要一个剪刀m = b[0]

b[1]时,有三种情况:

  • b[1] < b[0]:因为接下来要减的少,所以也要用一个剪刀m = b[1]
  • b[1] = b[0]:相同,上一个可以被覆盖,不需要额外操作。
  • b[1] > b[0]:这是,由于b[1] > b[0],前面大于b[1]的剪刀都不可以用。因为如果用了,那么a[1]就会小于b[1],此时不满足条件。

发现此时具有单调栈性质:通过从0到n-1进行遍历b数组,先将栈中小于bi的出栈,之后判断是否为空或者已经存在栈中(sk.top() == bi),如果为空或者bi不在栈中,入栈,表示一定需要这个

代码:

void solve() {
    int n; cin>>n;
    vector<int> a(n), b(n);
    for(auto &t: a) cin>>t;
    for(auto &t: b) cin>>t;
    bool ok = true;
    for(int i = 0; i < n; ++i) if(a[i] < b[i]) ok = false;
    map<int,int> mii;
    int m; cin>>m;
    for(int i = 0; i < m; ++i) {
        int t; cin>>t;
        mii[t]++;
    }
    stack<int> sk;
    for(int i = 0; i < n; ++i) {
        while(sk.size() && sk.top() < b[i]) sk.pop();
        if(a[i] == b[i]) continue;
        if(sk.empty() || sk.top() != b[i]) {
            sk.push(b[i]);
            mii[b[i]]--;
        }
    }
    for(auto t: mii) {
        ok &= t.vs >= 0;
    }
    puts(ok ? "YES" : "NO");
}
更多推荐

OJ练习第178题——收集树中金币

收集树中金币力扣链接:2603.收集树中金币题目描述给你一个n个节点的无向无根树,节点编号从0到n-1。给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1表示节点i处

Linux的Redis集群搭建-主从集群哨兵模式

上次教大家在linux中安装单机版本的redis:Linux安装Redis(图文解说详细版)这次我们讲一下Linux安装redis的集群版本文章目录🌴准备redis环境🌴第一步,下载redis🌴第二步,传输到三台服务器中🌴第三步,解压文件🌴第四步,安装gcc环境🌴第五步,编译🌴第六步,安装🌴主从复制集群

代码随想录算法训练营Day48 (day47休息) | 动态规划(9/17) LeetCode 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

来到了新的一块内容:打家劫舍问题。第一题198.HouseRobberYouareaprofessionalrobberplanningtorobhousesalongastreet.Eachhousehasacertainamountofmoneystashed,theonlyconstraintstoppingyo

S5的未来:即将到来的协议改进和可能性

大家好!在网络通信领域,S5代理协议一直扮演着重要的角色。它的灵活性和功能性使其成为许多应用程序和系统中的首选协议。今天,我将和大家分享关于S5的未来发展,包括即将到来的协议改进和可能性,让我们一起来看看吧!1.协议改进的动力尽管S5在提供代理服务方面表现出色,但仍存在一些限制和改进空间。随着网络技术的不断进步和应用场

TensorFlow框架 -- 入门详解

文章目录引言TensorFlow简介背景特点1.安装和配置1.1安装步骤1.1.1CPU版本1.1.2GPU版本安装:1.2验证安装:2.TensorFlow基础2.1数据类型与结构2.1.1张量(Tensors)2.1.2变量(Variables)2.1.3操作(Operations)2.2计算图(Computati

华为OD机试 - 计算面积 - 逻辑分析(Java 2023 B卷 100分)

目录专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明华为OD机试2023B卷题库疯狂收录中,刷题点这里专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题

Ansys Zemax | 如何建立二向分色分光镜

分光镜(Beamsplitter)可被运用在许多不同的场合。一般而言,入射光抵达二向分色分光镜(dichroicbeamsplitter)时,会根据波长的差异产生穿透或反射的现象。这篇文章将说明如何在OpticStudio的非序列模式(non-sequentialmode)中建立二向分色分光镜,以及如何根据需求自订镀膜

uniapp项目实践总结(十六)自定义下拉刷新组件

导语:在日常的开发过程中,我们经常遇到下拉刷新的场景,很方便的刷新游览的内容,在此我也实现了一个下拉刷新的自定义组件。目录准备工作原理分析组件实现实战演练内置刷新案例展示准备工作在components新建一个q-pull文件夹,并新建一个q-pull.vue的组件;按照前面文章所说的页面结构,编写好预定的自定义下拉刷新

[Qt]控件

文章摘于爱编程的大丙文章目录1.按钮类型控件1.1按钮基类QAbstractButton1.1.1标题和图标1.1.2按钮的Check属性1.1.3信号1.1.4槽函数1.2QPushButton1.2.1常用API1.2.2按钮的使用1.3QToolButton1.3.1常用API1.3.2按钮的使用1.4QRadi

PT@全概率公式和贝叶斯公式@后验概率和信念度量

文章目录abstract完备事件组(划分)基本性质全概率公式例贝叶斯公式例对立事件下的常用形式先验概率和后验概率例概率作为衡量人们对客观事件的信念度量补充条件概率的链式法则MorethantwoeventsExample例Morethantworandomvariables(多维随机变量下的链式乘法法则)Example

Vue路由与nodejs下载安装及环境变量的配置

目录前言一、Vue路由1.路由简介是什么作用应用场景2.SPA简介SPA是什么SPA的优点注意事项3.路由实现思路1.引入路由的js依赖2.定义组件3.定义组件与路径的对应关系4.通过路由关系获取路由对象router5.将路由对象挂载到实例中6.触发路由事件的按钮7.定义锚点---路由内容完整案例二、NodeJS下载安

热文推荐