当前位置: 首页 > news >正文

算法刷题day28

目录

  • 引言
  • 一、截断数组
  • 二、双端队列
  • 三、日期统计

引言

这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,因为 n n n 很小,所以就过了。但第二道题就不一样了,还是要有正确的思路,这样一下子就出来了,就不用太多繁琐的细节判断了,不过慢慢积累,下次见到就会了,加油!


一、截断数组

标签:贪心

思路:如图所示,如果 [ 1 , a ] [1,a] [1,a] 中的奇数和偶数的个数一样,那么 ( a , n ] (a,n] (a,n] 中的奇数和偶数的个数也一样,如果 [ 1 , b ] [1,b] [1,b] 中的奇数和偶数的个数一样,那么 ( a , b ] (a,b] (a,b] 中的奇数和偶数个数也一样,如果 [ 1 , c ] [1,c] [1,c] 中的奇数和偶数的个数相同,那么可得到划分的区间的奇数和偶数个数都一样。所以我们只要找到左半边奇数和偶数个数相同的点,那么这些点划分出来的区间都是满足要求的。还有一个条件就是截断成本不超过 B B B ,那么我们只要把这些满足要求的点的花费放到一个集合里,再升序排列,直到超过 B B B 为止,这时所截断操作的个数是最多的。
在这里插入图片描述

题目描述:

给定一个长度为 n 的整数数组 a1,a2,…,an。如果一个整数数组恰好包含相同数量的奇数元素和偶数元素,就称该数组为一个平衡数组。给定的数组 a 恰好就是一个平衡数组。现在,我们可以将该数组从中间截断,从而得到若干个非空子数组。关于截断操作:每次操作都需要一定成本,具体来说,将数组从 ai 和 ai+1 之间截断,所需成本为 |ai−ai+1|。
所有进行的截断操作的总成本不得超过 B。
所有截断得到的子数组都必须也是平衡数组。
请你计算,在满足所有要求的前提下,最多可以进行多少次截断操作。输入格式
第一行包含两个整数 n,B。第二行包含 n 个整数 a1,a2,…,an。输出格式
一个整数,表示在满足所有要求的前提下,可以进行的截断操作的最多次数。数据范围
前 4 个测试点满足 2≤n≤6。
所有测试点满足 2≤n≤100,1≤B≤100,1≤ai≤100。输入样例1:
6 4
1 2 5 10 15 20
输出样例1:
1
输入样例2:
4 10
1 3 2 4
输出样例2:
0
输入样例3:
6 100
1 2 3 4 5 6
输出样例3:
2

示例代码:

#include <bits/stdc++.h>using namespace std;const int N = 110;int n, B;
int a[N], cost[N];int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n >> B;for(int i = 1; i <= n; ++i) cin >> a[i];int odd = 0, even = 0, cnt = 0;for(int i = 1; i < n; ++i){if(a[i] % 2) odd++;else even++;if(odd == even) cost[cnt++] = abs(a[i+1] - a[i]);}sort(cost, cost+cnt);int res = 0, sum = 0;for(int i = 0; i < cnt; ++i){sum += cost[i];if(sum > B) break;res++;}cout << res << endl;return 0;
}

二、双端队列

标签:分类讨论、贪心

思路:就是分类讨论的一道题。我们用 a a a b b b 来表示队头和队尾两个元素, l a s t last last 代表上一次取的元素。1. a , b > l a s t a,b > last a,b>last,那么肯定是选小的取出来,不然另一头就永远不会动了。2. a = b > l a s t a=b>last a=b>last,那么从一边取了之后,另一边是不会再取了,所以我们提前模拟看从哪一边取会取得更多就取哪边。3. a ∣ b > l a s t a\ |\ b > last a  b>last, 那么只能取大的一边了。4. a , b < = l a s t a,b <= last a,b<=last ,结束模拟。

题目描述:

给定一个长度为 n 的双端队列 a1,a2,…,an。作为双端队列,我们既可以从队列的左端弹出元素,也可以从队列的右端弹出元素。我们希望弹出尽可能多的元素,并要求所有弹出元素按照弹出顺序进行排列,刚好可以构成一个严格递增的序列。请你计算,最多可以弹出多少个元素。输入格式
第一行包含整数 n。第二行包含 n 个整数 a1,a2,…,an。输出格式
输出一个整数 k,表示最大弹出元素数量。数据范围
前 6 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×105,1≤ai≤2×105。输入样例1:
5
1 2 4 3 2
输出样例1:
4
输入样例2:
7
1 3 5 6 5 4 2
输出样例2:
6
输入样例3:
3
2 2 2
输出样例3:
1
输入样例4:
4
1 2 4 3
输出样例4:
4

示例代码:

#include <bits/stdc++.h>using namespace std;int n;
deque<int> q;int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n;while(n--){int t; cin >> t;q.push_back(t);}int res = 0, last = 0;while(q.size()){int a = q.front(), b = q.back();if(a > last && b > last){res++;if(a < b) q.pop_front(), last = a;else if(b < a) q.pop_back(), last = b;else {deque<int> backup(q);int t1 = 0, t2 = 0, t = last;while(q.size() && q.front() > last){t1++, last = q.front(), q.pop_front();}q = backup;last = t;while(q.size() && q.back() > last){t2++, last = q.back(), q.pop_back();}q = backup;if(t1 > t2) q.pop_front(), last = a;else q.pop_back(), last = b;}}else if(a > last){res++;q.pop_front();last = a;}else if(b > last){res++;q.pop_back();last = b;}else break;}cout << res << endl;return 0;
}

三、日期统计

标签:暴力枚举、日期问题

思路:就是暴力枚举,每个区间因为年是给定的,所以时间复杂度只有 O ( N 4 ) O(N^4) O(N4) N = 100 N = 100 N=100 ,总的时间为 1 0 8 10 ^ 8 108 ,一秒就能跑出来,然后用 s e t set set 来判重即可。

题目描述:
在这里插入图片描述

示例代码:

#include <bits/stdc++.h>using namespace std;const int N = 110;int nums[N];
unordered_set<int> sset;const int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};bool is_leap(int y)
{if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0) return true;return false;
}int get_month_day(int y, int m)
{if(m == 2) return days[m] + is_leap(y);return days[m];
}bool is_vaild(int y, int m, int d)
{if(m < 1 || m > 12 || d < 1 || d > 31) return false;return d <= get_month_day(y,m);
}int main()
{for(int i = 0; i < 100; ++i) cin >> nums[i];int res = 0;for(int y1 = 0; y1 < 100; ++y1){if(nums[y1] != 2) continue;for(int y2 = y1 + 1; y2 < 100; ++y2){if(nums[y2] != 0) continue;for(int y3 = y2 + 1; y3 < 100; ++y3){if(nums[y3] != 2) continue;for(int y4 = y3 + 1; y4 < 100; ++ y4){if(nums[y4] != 3) continue;for(int m1 = y4 + 1; m1 < 100; ++m1){for(int m2 = m1 + 1; m2 < 100; ++m2){for(int d1 = m2 + 1; d1 < 100; ++d1){for(int d2 = d1 + 1; d2 < 100; ++d2){int y = 2023, m = nums[m1] * 10 + nums[m2], d = nums[d1] * 10 + nums[d2];int date = y * 10000 + m * 100 + d;if(sset.count(date)) continue;sset.insert(date);if(is_vaild(y,m,d)) res++;}}}}}}}}cout << res << endl;return 0;
}

相关文章:

算法刷题day28

目录 引言一、截断数组二、双端队列三、日期统计 引言 这几道题是周赛里的几道题目&#xff0c;第一道题目我没用这种方法&#xff0c;但还是做出来了&#xff0c;用的一种比较特殊的思考方法&#xff0c;就是把每一个点都判断出来&#xff0c;不满足要求的就舍弃&#xff0c;…...

vivado 使用Design Runs窗口、

使用Design Runs窗口 “设计运行”窗口显示在项目中创建的所有合成和实现运行。它包括用于配置、管理和启动运行的命令。 打开Design Run窗口 选择窗口 →  Design Runs打开“Design Runs”窗口。 设计运行窗口功能 •每个实现运行都缩进显示在其子级的合成运行下面。 …...

基于YOLOv8的手机摄像头的自动检测系统

文章大纲 数据集网络爬虫开源数据集标注目标定义标注标准标注工具标签更换脚本自制数据集下载地址自动检测系统设计与搭建模型训练与准确率代码仓库下载地址参考文献与学习路径随着移动通信技术的飞速发展,消费者对移动终端的要求也越来越高,各厂商纷纷提出自己的特色卖点,其…...

Ubuntu18.04添加内核模块(字符设备)

Ubuntu18.04添加内核模块&#xff08;字符设备&#xff09; 虚拟机Ubuntu18.04&#xff08;内核版本linux-5.4.0-135-generic&#xff09; 参考 嵌入式Linux驱动开发&#xff08;一&#xff09;——字符设备驱动框架入门 1 编译内核模块 创建字符设备代码文件char_dev.c&a…...

PromptBreeder---针对特定领域演化和发展提示词的方法

原文地址&#xff1a;promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址&#xff1a;https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示&#xff0c;包含离散的输入令牌&#xff1b;其缺点…...

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…...

一维数组_与指定数相同的数的个数

任务描述 输出一个整数序列中与指定数字相同的数的个数。 输入格式: 第一行为N&#xff0c;表示整数序列的长度(N < 100)&#xff1b; 第二行为N个整数&#xff0c;整数之间以一个空格分开&#xff1b; 第三行包含一个整数&#xff0c;为指定的整数m。输出格式: 输出为N…...

如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...

获取webshell的十种方法

一、直接上传获取webshell 这种对php和jsp的一些程序比较常见&#xff0c;MolyX BOARD就是其中一例&#xff0c;直接在心情图标管理上传。php类型&#xff0c;虽然没有提示&#xff0c;其实已经成功了&#xff0c;上传的文 件url应该是http://forums/images/smiles/下&#xf…...

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…...

网络地址转换协议NAT

网络地址转换协议NAT NAT的定义 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&#xff0c;但现在又想和因…...

Vue教学18:Element UI进阶组件探索,提升Vue应用的专业性

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十七篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…...

UE5.1_TimeLine

UE5.1_TimeLine 问题引入&#xff1a;UE的Timeline可以在一个场景下无限制的使用多少次&#xff1f;一个动画流程的Timeline的时间持续怎么算?TimeLine中嵌套Timeline的做法是否是合理的&#xff1f;...

Qt自定义控件

自定义控件 目的&#xff1a;将多个控件或者窗口作为一个整体被多次复用。 操作方式 1.首先进行自定义的ui设计&#xff0c;以及对应的.h和.cpp文件 2.到要使用的UI界面上&#xff0c;从控件库中拖拽一个Widget控件 3.右键点击"提升为" 4.填写自定义实现的类名&…...

nRF52832——串口 UART 和 UARTE 外设应用

nRF52832——串口 UART 和 UARTE 外设应用 UART 和 UARTE 原理UART 功能描述UARTE 功能介绍 应用实例串口打印实例串口输入与回环UART 模式串口中断 UART 和 UARTE 原理 UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用的通信接口&#xff0c;在 nRF52 芯…...

String 底层为什么使用 final 修饰?

1、典型回答 对于这个问题&#xff0c;Java之父詹姆斯 高斯林&#xff08;James Gosling&#xff09; 是这样回答的&#xff1a; I would use an immutable whenever I can 翻译为中文&#xff1a;只要允许&#xff0c;我就会使用不可变对象 而作为普通人的我们来说&#xff0…...

NIN网络中的网络

是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深&#xff08;加宽指增加通道数&#xff0c;那加深呢&#xff1f;&#xff08;层数增加叭 Ni…...

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…...

高质量快刊!中科院1区TOP,Elsevier出版社,最快2个月23天录用!20天见刊!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;11.0-11.5&#xff0c;JCR1区&#xff0c;中科院1区TOP 【出版社】Elsevier出版社 【版面情况】正刊&#xff0c;2023.3.31截稿 【检索情况】SCIE&EI双检&#xff0c;预计3个月左右录用 【征稿领域】…...

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索&#xff0c;在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程&#xff0c;同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...