牛客小白月赛113

news2025/6/7 15:44:25

前言:这场的E题补的我头皮都发麻了。

A. 2025

题目大意:一个仅有‘-’‘*’组成的字符串,初始有一个sum = 1, 从左到右依次遍历字符串,遇到-就让sum--;遇到*就让sum*= 2,问sum有没有可能大于等于2025。

code:

#include <iostream>

using namespace std;

int main()
{
    string s; cin >> s;
    int sum = 1;
    for(auto ch : s)
    {
        if(ch == '-') sum--;
        else sum *= 2;
        if(sum >= 2025)
        {
            cout << "YES" << endl;
            return 0;
        }
    }
    cout << "NO" << endl;
    return 0;
}

B. 好字符串

题目大于:一个仅有小写字母组成的字符串s,下标从1开始,执行下面列至多操作一次:选择一个位置删除该位置的字符,剩下的字符按照原来的顺序从后依次拼接,问是否可以使得任意两个相邻的位置的字符不同。

【解题】:我们发现需要删除的是两个相邻字符相同的情况,我们可以从从前往后遍历统计相邻字符数就行。

code:

#include <iostream>
using namespace std;
int main()
{
    int n; cin >> n;
    string s; cin >> s;
    int cnt = 0;
    for(int i = 1; i < s.size(); i++)
    {
        if(s[i] == s[i - 1]) cnt++;
    }
    if(cnt <= 1) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

C. 连续数组

题目大意:
给你 q 个数组,其中第 i 个数组中的元素个数为 ki。现在我们需要将这些数组全部组合成一个新的数组 A,但要保证每个数在原来的数组中的相对顺序不变,如果可以通过一些组合方式,使得新数组 A 为连续数组,则我们认为其为好数组。问是否可以组成连续数组。

【解题】:不难发现:要组成连续数组且在原数组位置不变前提需要每个数组的元素必须升序;

并且不能有相同的元素,换句话说最小值到最小值加元素个数减1的数都要出现;剩下的情况都是合法的。

code:

#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
int q;

int main()
{
    cin >> q;
    unordered_map<int, int> mp;
    int mina = 0x3f3f3f3f;
    int cnt = 0;
    while(q--)
    {
        int k; cin >> k;
        cnt += k;
        int pre = 0;
        for(int i = 1; i <= k; i++)
        {
            int x; cin >> x;
            if(x <= pre)
            {
                cout << "NO" << endl;
                return 0;
            }
            mp[x]++;
            pre = x;
            mina = min(mina, x);
        }
    }
    for(int i = mina; i <= mina + cnt - 1; i++)
    {
        if(!mp.count(i))
        {
            cout << "NO" << endl;
            return 0;
        }
    }
    cout << "YES" << endl;
    return 0;
}

D. mex

题目大意:给一个长度为n的数组a,问执行下面操作多少次可以使得数组的元素都相同?

  • 使所有a中的元素变为max(ai - mex(a), 0)。

mex(a) 指a数组中没有出现的最小非负整数。

【解题】:

  • 对于初始元素全相同的情况不需要操作直接输出0就行;
  • 如果数组中没有出现0就是无解;
  • 除了该元素最终减到0,它与其余数的差值不变;
  • 像0 1 2 3 4 这样的数组可以一次消除;
  • 对于0 5 6 7 8 这样的数组可以通过5 - 0 - 1次操作变为0 1 2 3 4;

所有我们最终只需要统计非连续两数的差值减一就行的和cnt(注意如果两元素相同要跳过),最后还要操作一次把所有的数变为0,最后答案就是cnt + 1。 

code:

#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;

typedef long long LL;
const int N = 1e5 + 10;
int n;
LL a[N];
unordered_map<int, int> mp;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) 
    {
        cin >> a[i];
        mp[a[i]]++;
    }
    if(mp.size() == 1) 
    {
        cout << 0 << endl;
        return 0;
    }
    else if(!mp.count(0))
    {
        cout << -1 << endl;
        return 0;
    }    
    else
    {
        sort(a + 1, a + 1 + n);
        LL cnt = 0;
        // a[1] = 0
        for(int i = 1; i <= n; i++)
        {
            if(a[i] == 0 || a[i] == a[i - 1]) continue;
            cnt += a[i] - a[i - 1] - 1;
        }
        cout << cnt + 1 << endl;
    }
    return 0;
}
// 8
// 0 0 3 4 5 8 10 11 12 15

E. 可划分数组

题目大意:一段区间的每一个元素都至少有一个除自己之外的元素与自己不互质称这样的区间是一个合法区间。给定一个数组,你需要尽可能多的划分合法区间。

【解题】:

因为划分的区间必须是连续的,我们可以对合法区间进行合并,因而想到用区间dp解决这道问题。

定义状态表示:dp[l][r]:从l,r区间内可划分最大段数。

状态转移:枚举l,r内的所有断点i,在保证区间合法的情况下合并断点左右区间:

dp[l][r] = \sum_{i=l+1}^{r - 2}max(dp[l][i] + dp[i +1][r])

数据范围n最大为1e3,上述做法的时间复杂度为O(n^3)。

考虑优化:对于一段l,r

发现对于所有的合法断点其实统计的区间是一样的,存在重复计算的情况,不妨把 dp[i+1][r] 恒定设为1(0的情况不合法,>1的情况和1相同)。

原转移方程变为:dp[l][r] = \sum_{i=l+1}^{r - 2}max(dp[l][i] + 1) 

需要满足下列两个条件

  1. 区间(l,i)合法;
  2. 区间(i + 1, r)合法,且(i + 1, r)区间仅可划分成一个合法区间。

然后我们发现状态的转移只与i有关与 l 无关了, 因此考虑把第一维删除,让 l 恒为 1

  • 优化后的状态表示:dp[r] 表示:从1 - r区间的最大合法段数。
  • 优化后的状态转移:dp[r] = \sum_{i=l+1}^{r - 2}max(dp[i] + 1)
  • (1, i)区间合法;(i + 1, r)区间合法且仅有一个区间。
  • dp[n] 即为答案。

 枚举r和i的时间复杂度就已经是O(n^2),因为我们只能用O(1) or O(logn) 的时间去判断两段区间是否合法。

预处理两个数组:

  • pre[i]表示:第 i 个数前面第一个与它不互质数的位置;
  • suf[i]表示:第 i 个数后面第一个与它不互质数的位置。预处理的时间复杂度为O(n^2)。

 合法区间需要满足:

\forall i \mathbb\in (l, r), \exists j\in (l,r), gcd(a[i],a[j])\neq 1 ,(r - l + 1 \geqslant 2)

根据上述数组判断合法区间的条件转化为:

\forall i \mathbb\in (l, r), pre[i]\geqslant l || suf[i]\leqslant r ,(r - l + 1 \geqslant 2)

根据析取的性质我们进一步优化:

\forall i \mathbb\in (l, r), (pre[i]\geqslant l) and (suf[i]> r) ,(r - l + 1 \geqslant 2)

根据>=的数学性质进一步优化:\forall i \mathbb\in (l, r), (min(pre[i]))\geqslant l) and (suf[i]> r) ,(r - l + 1 \geqslant 2)

因此对两端区间合法行的判断我们采取下面方法:

  • 预处理维护(1,i)的合法性。
  • 从后往前枚举i,维护minp(pre[i]的最小值)从而判断(i + 1,r)的合法性。

 这样我们就成功把判断区间所有元素是否满足存在一个数使它俩不互质。

最后一点代码需要注意事项:

  • 我们从左到右枚举 r,i 需要满足 i\in (2, r - 2) \geqslant 1  r - 2 - 2 + 1 >= 1 ,所以 r 从 4 开始枚举;

总体的时间复杂度为:O(n^2 logn)

code:

#include <iostream>
#include <vector>
#include <unordered_map>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
#define endl '\n'
const int N = 2e3 + 10;
const int INF = 0x3f3f3f3f;
int a[N];
int n;
int dp[N]; 
int suf[N], pre[N];
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}


void solve() 
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    // 预处理 pre suf数组
    for(int i = 1; i <= n; i++)
    {
        for(int j = i - 1; j >= 1; j--)
        {
            if(gcd(a[i], a[j]) != 1) 
            {
                pre[i] = j;
                break;
            }
        }
        suf[i] = n + 1;
        for(int j = i + 1; j <= n; j++)
        {
            if(gcd(a[i], a[j]) != 1) 
            {
                suf[i] = j;
                break;
            }
        }
    }
    // 预处理(1,i)区间的合法性
    for(int i = 2; i <= n; i++)
    {
        dp[i] = 1;
        for(int j = 1; j <= i; j++)
        {
            if(!(pre[j] >= 1 || suf[j] <= i))
            {
                dp[i] = 0;
                break;
            }
        }
    }
    // 判断(i + 1, r)区间的合法性 + 状态转移
    for(int r = 4; r <= n; r++)
    {
        int minp = suf[r] > r ? pre[r] : INF; 
        for(int i = r - 1 - 1; i >= 2; i--)
        {
            if(suf[i + 1] > r) minp = min(minp, pre[i + 1]);
            if(minp >= i + 1 && dp[i] != 0) dp[r] = max(dp[r], dp[i] + 1);
        }
    }
    cout << (dp[n] == 0 ? -1 : dp[n]) << endl;
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int T = 1;  
	// cin >> T;
	while(T--)
	{
        solve();
	}
	return 0;
}

 

累了F后面补,敬请期待QAQ。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac版本Android Studio配置LeetCode插件

第一步&#xff1a;Android Studio里面找到Settings&#xff0c;找到Plugins&#xff0c;在Marketplace里面搜索LeetCode Editor。 第二步&#xff1a;安装对应插件&#xff0c;并在Tools->LeetCode Plugin页面输入帐号和密码。 理论上&#xff0c;应该就可以使用了。但是&a…

电子电路基础1(杂乱)

电路基础知识 注意&#xff1a;电压源与电流源的表现形式 注意&#xff1a;在同一根导线上电势相等 电阻电路的等效变换 电子元器件基础 电阻

【openssl】升级为3.3.1,避免安全漏洞

本文档旨在形成 对Linux系统openssl版本进行升级 的搭建标准操作过程&#xff0c;搭建完成后&#xff0c;实现 openssl 达到3.3以上版本&#xff0c;避免安全漏洞 效果。 一、查看当前版本 版本不高于3.1的&#xff0c;均需要升级。 # 服务器上运行以下命令&#xff0c;查看…

使用 HTML +JavaScript 从零构建视频帧提取器

在视频编辑、内容分析和多媒体处理领域&#xff0c;常常需要从视频中提取关键帧。手动截取不仅效率低下&#xff0c;还容易遗漏重要画面。本文介绍的视频帧提取工具通过 HTML5 技术栈实现了一个完整的浏览器端解决方案&#xff0c;用户可以轻松选择视频文件并进行手动或自动帧捕…

论文速读《DexWild:野外机器人策略的灵巧人机交互》

项目链接&#xff1a;https://dexwild.github.io/ 论文链接&#xff1a;https://arxiv.org/pdf/2505.07813 0. 简介 2025年5月&#xff0c;卡内基梅隆大学&#xff08;CMU&#xff09;发布了一篇突破性论文《DexWild: Dexterous Human Interactions for In-the-Wild Robot Pol…

Bug问题

一、list 页面 import React, { useEffect, useState } from react; import { shallowEqual, useHistory, useSelector } from dva; import { Button, message } from choerodon-ui/pro; import formatterCollections from hzero-front/lib/utils/intl/formatterCollections; …

【数据结构】5. 双向链表

文章目录 一、链表的分类1、双向链表的结构 二、双向链表的实现0、准备工作1、初始化2、打印3、尾插4、头插5、尾删6、头删7、查找8、在指定位置之后插入数据9、删除指定位置10、销毁 一、链表的分类 链表总共分为8种&#xff0c;具体的分组方式如图所示&#xff1a; 带头指的…

【Linux手册】冯诺依曼体系结构

目录 前言 五大组件 数据信号 存储器&#xff08;内存&#xff09;有必要吗 常见面试题 前言 冯诺依曼体系结构是当代计算机基本架构&#xff0c;冯诺依曼体系有五大组件&#xff0c;通过这五大组件直观的描述了计算机的工作原理&#xff1b;学习冯诺依曼体系可以让给我们更…

Mobile App UI自动化locator

在开展mobile app UI层自动化测试时&#xff0c;编写目标元素的locator是比较耗时的一个环节&#xff0c;弄清楚locator背后的逻辑&#xff0c;可以有效降低UI层测试维护成本。此篇博客以webdriverioappium作为UI自动化工具为例子&#xff0c;看看有哪些selector方法&#xff0…

(LeetCode 每日一题) 1061. 按字典序排列最小的等效字符串 (并查集)

题目&#xff1a;1061. 按字典序排列最小的等效字符串 思路&#xff1a;使用并查集&#xff0c;来将等价的字符连起来&#xff0c;形成一棵树。这棵树最小的字母&#xff0c;就代表整颗树&#xff0c;时间复杂度0(n)&#xff0c;细节看注释。 C版本&#xff1a; class Solutio…

linux 安装mysql8.0;支持国产麒麟,统信uos系统

一&#xff1a;使用我已经改好的mysql linux mysql8.0解压可用&#xff0c;点我下载 也在国产麒麟系统&#xff0c;统信uos系统也测试过&#xff0c;可用&#xff1b; 下载后&#xff0c;上传mysql.tar.gz 然后使用root角色去执行几个命令即可&#xff1b;数据库密码&#xf…

C#实现远程锁屏

前言 这是一次提前下班没有锁屏进而引发的一次思考后的产物&#xff0c;思考的主要场景是当人离开电脑后&#xff0c;怎么能控制电脑锁屏&#xff0c;避免屏幕上的聊天记录被曝光。 首先想到通过系统的电源计划设置闲置超时时间熄屏&#xff0c;这可能是最接近场景的解决方案&a…

SpringBoot3整合MySQL8的注意事项

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 注意事项 1、请添加添加如下依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><…

智语心桥:当AI遇上“星星的孩子”,科技如何点亮沟通之路?

目录: 引言:当科技的温度,遇见“星星的孩子”“智语心桥”:一座为孤独症儿童搭建的AI沟通之桥核心技术探秘:AI如何赋能“读心”与“对话”?个性化魔法:AI如何实现“千人千面”的精准干预?应用场景畅想:从家庭到机构,AI的全方位支持为什么是“智语心桥”?——价值、可…

itop-3568开发板机器视觉opencv开发手册-图像绘制-画线

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程 \04_OpenCV 开发配套资料\11”目录下&#xff0c;如下图所示&#xff1a; cv2.line 函数功能&#xff1a; 绘制一条直线。 函数原型&#xff1a; cv2.line(img,pt1,pt2,color,thicknessNone,lin…

sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境

sudo docker exec -it backend bash&#x1f50d; 总体作用 这条命令的作用是&#xff1a; 以交互方式&#xff08;interactive&#xff09;进入名为 backend 的正在运行的 Docker 容器的命令行环境。 你会进入容器的“终端”&#xff0c;就像登录到一个 Linux 系统一样&#…

浅析EXCEL自动连接PowerBI的模板

浅析EXCEL自动连接PowerBI的模板 之前我分享过&#xff1a;PowerBI链接EXCEL实现自动化报表 &#xff0c;其中一个关键工具就是提到的EXCEL链接模板&#xff0c;即宏工作薄。 今天就大概来聊一聊这个宏工作簿的底层原理是啥&#xff0c;怎么实现的。 第一步&#xff1a; 打开…

java32

1.反射 获取类&#xff1a; 获取构造方法&#xff1a; 获取权限修饰符&#xff1a; 获取参数信息&#xff1a; 利用反射出来的构造器来创建对象&#xff1a; 获取成员变量&#xff1a; 获取成员方法&#xff1a; 综合练习&#xff1a; 动态代理&#xff1a;

【Redis】zset 类型

zset 一. zset 类型介绍二. zset 命令zaddzcard、zcountzrange、zrevrange、zrangebyscorezpopmax、zpopminzrank、zrevrank、zscorezrem、zremrangebyrank、zremrangebyscorezincrby阻塞版本命令&#xff1a;bzpopmax、bzpopmin集合间操作&#xff1a;zinterstore、zunionstor…

从Gartner报告看Atlassian在生成式AI领域的创新路径与实践价值

本文来源atlassian.com&#xff0c;由Atlassian全球白金合作伙伴——龙智翻译整理。 二十余年来&#xff0c;Atlassian始终是创新领域的领军者。凭借对团队协作本质的深刻理解&#xff0c;Atlassian在AI时代仍持续引领协作方式的革新。如今&#xff0c;这一领先地位再次获得权威…