牛客小白月赛101

        考点为:A题 滑动窗口、B题 栈、C题 找规律、D 差分、E 筛约数。C题可能会卡住,不过手搓几组,或者模拟几组规律就显而易见了

A:

思路:

        无论去头还是去尾,最后所留下的数据长度一定为:n - k ,那么问题就变成:对于数组a,长度为n - k的子序列中,sum最大的子序列。即滑动窗口,由于是求和,那么前缀和也可解。

代码:

        前缀和:

#include<bits/stdc++.h>using namespace std;const int N = 5 * 1e3 + 10;int n, k;
int a[N], sum[N];int main()
{cin >> n >> k;for(int i = 1; i <= n; i ++ ){cin >> a[i];sum[i] = sum[i - 1] + a[i];}int s = n - k, ans = -1;for(int i = s; i <= n; i ++ )ans = max(ans, sum[i] - sum[i - s]);cout << ans << endl;
}

滑动窗口:

        数组模拟:

#include<bits/stdc++.h>using namespace std;const int N = 5 * 1e3 + 10;int n, k;
int a[N];int main()
{cin >> n >> k;for(int i = 0; i < n; i ++ ) cin >> a[i];int s = n - k, ans = -1;int cnt = 0;for(int i = 0; i < n; i ++ ){cnt += a[i];if(i >= s - 1){ans = max(cnt, ans);cnt -= a[i - s + 1];}}if(n == k) ans = 0;cout << ans << endl;
}

         队列:

#include<bits/stdc++.h>using namespace std;const int N = 5 * 1e3 + 10;int n, k;
deque<int> dq;//滑动窗口一律使用双端队列
int a[N];int main()
{cin >> n >> k;for(int i = 1; i <= n; i ++ ) cin >> a[i];int sum = 0, ans = -1;for(int i = 1; i <= n; i ++ ){dq.push_back(a[i]);if(dq.size() == n - k){for(auto &t : dq) sum += t;dq.pop_front();ans = max(ans, sum);sum = 0;}}if(n == k) ans = 0;cout << ans << endl;
}

B

思路:

        括号问题,即匹配左右括号。这里tb 和fc 当作左右括号,判断是否能匹配即可。我们用来维护,因为栈顶元素即是刚放进去的元素,即top()函数。

代码:

#include<bits/stdc++.h>using namespace std;void solve()
{int n;cin >> n;string S;cin >> S;stack<char> a;for(auto &ch : S){//能消除则消除if(!a.empty()){if(a.top() == 'f' && ch == 'c') {a.pop();continue;}if(a.top() == 't' && ch == 'b') {a.pop();continue;}}//否则的话,将当前元素放入进来a.emplace(ch);}cout << a.size() << endl;
}int main()
{solve();return 0;
}

C

思路:

        找规律,既然有传送阵如此强烈的性质,那么优先考虑规律而非bfs。

        先来观察(1, 1)附近的点的gcd:(1,2),(2,1),(2,2)->1、1、2。无论n的大小如何,我们都不可能直接传送到(n,n)(原因很简单,gcd(n,n) = n,无法直接传送),而(n,n)附近的点一定为1或2,又因为不可以借助gcd = 1的点进行传送,所以借助距离最近的传送阵gcd = 2时为最优。所以分为如下几种情况。

        ①当n为偶数时,距离(n,n)最近的传送点即为:(n - 2,n)、(n,n - 2),所以消耗的步数为:从(1,1)走向(2,2)所消耗的两步 + 从(n - 2,n)或者(n,n - 2)走向(n,n)所消耗的两步,一共是4步

        ②当n为奇数时,距离(n,n)最近的传送点gcd全为1,但是n - 1为偶数,那么对于(n - 1,
n - 1)从(1,1)走到偶数点只需要四步,所以先从(2,2)传送至距离(n,n)最近的可传送的点(n - 1,n - 1),再走两步即可抵达(n,n)点,则一共需要6步

        ③当n过小时,模拟可发现当n <= 3时,直接走所需的步数最少。1' n == 1,所需0步。2' n == 2所需两步。3' n == 3所需4步

代码:

#include<bits/stdc++.h>using namespace std;int n;
int main()
{cin >> n;if(n < 4){if(n == 1) cout << 0;if(n == 2) cout << 2;if(n == 3) cout << 4;}else if(n % 2 == 1) cout << 6;else cout << 4;return 0;
}

D

思路:

        问题转换:求出所有包含x位置的子区间。转化之后就变成很简单的差分问题,用一个差分数组ans[ ]来维护,最后输出ans[x]即可。
        回归到本题,只需要判断包含该点的子区间的和是否为平方数即可,对于本题数据n <= 1000,ai <= 100000,那么总区间最大长度为1e8,对于1~1e8之间的平方数为10000个。所以我们只需要用O(n ^ 2)的时间复杂度内维护差分数组,再用O(1) 的时间复杂度输出即可,总时间复杂度为O(n ^ 2 + q)

代码:

#include<bits/stdc++.h>using namespace std;int n, q;
int ans[1050], a[1050], sum[1050];
set<int> st;
int main()  
{cin >> n >> q;//求出1e8以内的所有平方数,并将其插入到set中for(int i = 1; i <= 10000; i ++ ) st.insert(i * i);for(int i = 1; i <= n; i ++ ){cin >> a[i];sum[i] = sum[i - 1] + a[i];}for(int i = 0; i < n; i ++ )for(int j = i + 1; j <= n; j ++ )if(st.find(sum[j] - sum[i]) != st.end())//如果该区间的和是平方数{//维护差分数组。由于数组的索引从0开始,所以+1.ans[i + 1] ++ ;ans[j + 1] -- ;}for(int i = 1; i <= n; i ++ ) ans[i] += ans[i - 1];while(q -- ){int x;cin >> x;//即包含x的区间,且区间和为平方数的所有区间的个数cout << ans[x] << endl;}return 0;
}

E

思路:

        感觉是这次月赛最简单的一道题。在数组最大值的范围之内,不属于数组的数(x)单独记录下来,那么数组内的数只要是x的倍数,那么都不是一个好数

代码:

#include<bits/stdc++.h>using namespace std;
const int N = 1e6 + 10;int n;
int st[N], a[N];
int main()
{cin >> n;int mans = -1;for(int i = 0; i < n; i ++ ){cin >> a[i];st[a[i]] = 1;//出现了,则记为1mans = max(mans, a[i]);//找出数组内的最大值}sort(a, a + n);//特判if(a[0] != 1){cout << 0;return 0;}//已经特判1,则可以从2开始for(int i = 2; i <= mans; i ++ )//找出不属于数组的数,对于所有是其倍数的数全都不符合题意if(!st[i])for(int j = i; j <= mans; j += i) st[j] = 0;int ans = 0;//遍历一遍即可for(int i = 1; i <= mans; i ++ )if(st[i]) ans ++ ;cout << ans << endl;return 0;
}

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

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

相关文章

Dbt自动化测试实战教程

数据团队关键核心资产是给消费者提供可信赖的数据。如果提供了不被信任的数据&#xff0c;那么支持决策智能依赖于猜测和直觉。原始数据从不同来源被摄取智数据仓库&#xff0c;数据产品团队有责任定义转换逻辑&#xff0c;将源数据整合到有意义的数据产品中&#xff0c;用于报…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中&#xff0c;我们常常会遇到一些看似合理实则错误的表达习惯。今天&#xff0c;我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先&#xff0c;我们需要明确&#xff0c;“double confi…

Springboot2笔记核心技术——1.基础入门

目录 1.spring和springboot的区别 1. 框架 vs. 工具 2. 配置方式 3. 启动方式 4. 项目结构 5. 生态系统 2.SpringBoot2入门 1. 创建项目 2. 项目结构 3. 编写主类 4. 添加Controller 5. 配置应用 6. 启动应用 7. 测试应用 8. 进一步学习 3.了解自动配置原理 1…

R 语言 | 取数据框一列子集时,如何保持数据框结构?drop=F

数据框取多列时&#xff0c;返回的还是数据框。 取一列时&#xff0c;默认退化为一个向量&#xff1a; > class(iris) [1] "data.frame" > t1iris[, 1:2] > class(t1) [1] "data.frame"> t2iris[,1] > class(t2) [1] "numeric" …

2.1 HuggingFists系统架构(二)

部署架构 上图为HuggingFists的部署架构。从架构图可知&#xff0c;HuggingFists主要分为服务器(Server)、计算节点(Node)以及数据库(Storage)三部分。这三部分可以分别部署在不同的机器上&#xff0c;以满足系统的性能需求。为部署方便&#xff0c;HuggingFists社区版将这三部…

YOLOv9改进,YOLOv9主干网络替换为GhostNetV2(华为提出的轻量化架构)

摘要 摘要:轻量级卷积神经网络(CNN)专为移动设备上的应用而设计,具有更快的推理速度。卷积操作只能在窗口区域内捕捉局部信息,这限制了性能的进一步提升。将自注意力引入卷积可以很好地捕捉全局信息,但会极大地拖累实际速度。本文提出了一种硬件友好的注意力机制(称为 D…

CSP-S 2024 提高级 第一轮(初赛) 完善程序(2)

【题目】 CSP-S 2024 提高级 第一轮&#xff08;初赛&#xff09; 完善程序&#xff08;2&#xff09; (2)&#xff08;次短路&#xff09;已知一个n个点m条边的有向图G&#xff0c;并且给定图中的两个点s和t&#xff0c;求次短路&#xff08;长度严格大于最短路的最短路径&am…

TFTP协议

目录 一、TFTP协议概述 1.1 TFTP协议简介 1.2 TFTP协议特点 二、TFTP协议原理 2.1 TFTP协议工作流程 2.2 TFTP协议数据包格式 三、TFTP协议应用场景 3.1 网络设备配置文件传输 3.2 虚拟机镜像文件传输 3.3 IoT设备固件升级 四、TFTP协议优化方法 4.1 增加超时重传机…

深入理解Python中的数据结构:OrderedDict

目录 1. 前言 2. OrderedDict的基本概念 2.1 OrderedDict的创建 2.2 排序特性 2.3 比较OrderedDict和标准字典 3. OrderedDict的高级功能 3.1 元素的移动 3.2 重新排序 3.3 反转顺序 4. OrderedDict的性能表现 4.1 插入性能测试 4.2 读取性能测试 5. OrderedDict的…

数据结构之——队列

一、队列概述 队列是一种操作受限的线性表&#xff0c;其限制条件为允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。插入的一端叫做队尾&#xff0c;删除的一端叫做队头。向队列中插入新元素的行为称为进队&#xff0c;从队列中删除元素的行为称为出队。例如军训的…

Java服务端开发中的API版本管理:从URI到Header的不同策略

Java服务端开发中的API版本管理&#xff1a;从URI到Header的不同策略 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java服务端开发中&#xff0c;API版本管理是一个重要而复杂的问题。随着业…

前端文件上传全过程

特别说明&#xff1a;ui框架使用的是蚂蚁的antd 这里主要是学习前端上传接口的传递参数包括前端上传之前对于代码的整理 一、第一步将前端页面画出来 源代码&#xff1a; /** 费用管理 - IT费用管理 - 费用数据上传 */ import { useState } from "react"; import {…

Leetcode 56.合并区间-Python

链接&#xff1a;56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff…

【基础知识】网络套接字编程

套接字 IP地址 port&#xff08;端口号&#xff09; socket&#xff08;套接字&#xff09; socket常见API //创建套接字 int socket(int domain, int type, int protocol); //绑定端口 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); //监听套接字…

Prometheus篇之利用promtool工具校验配置正确性

promtool工具 promtool是Prometheus的一个命令行工具&#xff0c;它提供了一些功能来帮助用户进行Prometheus配置文件&#xff08;如prometheus.yml&#xff09;的检查、规则检查和调试。 解释 promtool check config: 验证Prometheus配置文件的语法和设置。 promtool命令&…

【最基础最直观的排序 —— 选择排序算法】

最基础最直观的排序 —— 选择排序算法 选择排序算法是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&a…

vue3常用的组件间通信

一 props props 可以实现父子组件通信&#xff0c;props数据是只读。 1. 基本用法 在父组件中&#xff0c;你可以这样传递 props&#xff1a; <template><ChildComponent message"Hello, Vue 3!" /> </template><script setup> import C…

WebPage-Bootstrap框架(container类,container-fluid类,栅格系统)

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【Bug解决】Nacos启动成功,但却无法访问(提示:无法访问此网站,192.168.10.88的响应时间过长)

情形如下&#xff1a;第一次启动运行一些正常&#xff0c;非正常关闭虚拟机&#xff0c;第二次启动虚拟机查看容器状态如下&#xff1a; docker nacos容器一切正常启动&#xff0c;但是就是无法访问web控制面板&#xff0c;访问无法连接。 首先&#xff1a;执行命令查看日志 …