算法刷题day28

news2024/11/15 23:42:15

目录

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

引言

这几道题是周赛里的几道题目,第一道题目我没用这种方法,但还是做出来了,用的一种比较特殊的思考方法,就是把每一个点都判断出来,不满足要求的就舍弃,因为 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;
}

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

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

相关文章

ElasticSearchLinux安装和springboot整合的记录和遇到的问题

前面整合遇到的一些问题有的记录在下面了&#xff0c;有的当时忘了记录下来&#xff0c;希望下面的能帮到你们 1&#xff1a;Linux安装ES 下载安装&#xff1a; 参考文章&#xff1a;连接1 连接2 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch…

如何关闭微软的Edge浏览器右击提示的:“使用copilot重写“的提示?

最近在使用微软的edge浏览器写文档的时候&#xff0c;总是不小心右击鼠标&#xff0c;提示 有时候挺烦人的&#xff0c;那怎么关闭呢&#xff1f; 打开edge浏览器的设置 在设置中搜索AI&#xff0c;并关闭AI书写的选项就好了 这样就可以获得一个干净的界面了&#xff0c;不…

SPEL表达式及注入漏洞

SPEL,全称为Spring表达式语言&#xff0c;是一个由 Spring 框架提供的表达式语言。它是一种基于字符串的表达式语言&#xff0c;可以在运行时对对象进行查询和操作。 SpEL 支持在XML和注解配置中使用&#xff0c;它可以在Spring框架的各种组件中使用&#xff0c;如Spring MVC …

Visual grounding-视觉定位任务介绍

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

知识图谱技术综述

作者简介:徐增林(1980 − ),男,博士,教授,主要从事机器学习及其在社会网络分析、互联网、计算生物学、信息安全等方面的研究. 【摘要】 知识图谱技术是人工智能技术的重要组成部分,其建立的具有语义处理能力与开放互联能力的知识库,可在智能搜索、智能问答、个性化推…

Java中抽象类和接口有什么区别?

1、典型回答 接口和抽象类都是用来定义对象公共行为的&#xff0c;二者的主要区别有以下几点不同&#xff1a; 类型扩展不同&#xff1a;抽象类是单继承&#xff0c;而接口是多继承&#xff08;多实现&#xff09;方法/属性访问控制符不同&#xff1a;抽象类方法和属性使用访问…

Yolov8-车辆跟踪(BoT-SORT和ByteTrack算法)

这两种代码都是成熟的&#xff0c;直接调佣即可&#xff0c;下面是使用这两种算法的代码。 直观感受&#xff1a;ByteTrack预测的速度感觉比BoT-SORT快一些&#xff0c;流畅一些。 from ultralytics import YOLOmodel YOLO(yolov8n.pt)# results model.track(source".…

人工智能迷惑行为大赏

文章目录 每日一句正能量前言人工智能的“幽默”瞬间美好愿景背后的潜规则人工智能应用人脸识别视频监控分析自动驾驶/驾驶辅助 后记 每日一句正能量 把坚持当成一种习惯&#xff0c;别人光鲜的背后&#xff0c;都有加倍的付出&#xff0c;没有谁比谁更容易&#xff0c;只有谁比…

蚂蚁链摩斯荣获“艾瑞保险业数字化卓越服务商“奖

近日&#xff0c;艾瑞咨询发布《2023年中国保险业数字化转型研究报告》&#xff0c;摩斯隐私计算解决方案被报告入选&#xff0c;并获得“保险业数字化卓越服务商”奖。 蚂蚁摩斯是隐私计算行业的领先布局者&#xff1a;早在2017年&#xff0c;蚂蚁集团启动了隐私计算项目&…

【存储】ZYNQ+NVMe小型化全国产存储解决方案

文章目录 1、背景2、基础理论3、设计方案3.1、FPGA设计方案3.1.1、NVMe控制器实现3.1.2、NVMe控制器实现 3.2 驱动软件设计方案3.2.1 读写NVMe磁盘软件驱动3.2.2 NVMe磁盘驱动设计3.2.3 标准EXT4文件系统设计 3.3 上位机控制软件设计方案 4、测试结果4.1 硬件测试平台说明4.2 测…

HTML图片和多媒体标签

文章目录 1. 图片标签1.1. img 标签1.2. 相对路径1.3. 绝对路径 2. 多媒体标签2.1. 音频标签2.2. 视频标签 1. 图片标签 1.1. img 标签 img标签是用来加载图片的&#xff0c;比如我们加载一张喜羊羊的照片。 <!DOCTYPE html> <html lang"zh-CN"><h…

嵌入式学习37-TCP并发模型

TCP并发模型: 1.TCP多线程模型: 缺点: 1.创建线程会带来 资源开销 2.能够实现的 并发量 比较有限 2.IO模型: 1.阻塞IO: 没有…

Linux学习(1)——Linux文件目录

1.Linux目录层次标准 Linux文件系统最顶端的目录是——根目录&#xff1a;“/”&#xff0c;Linux所有文件和目录&#xff0c;都是挂载在根目录下面的。 可以在Linux终端中用“cd /”命令&#xff0c;进入到根目录下&#xff1b;再用“ls”命令&#xff0c;查看里面的各个子目录…

高级DBA带你处理MySQL集群爆表导致硬盘爆满系统产品宕机实际生产事故处理实战案例全网唯一

高级DBA带你处理MySQL集群爆表导致硬盘爆满系统产品宕机实际生产事故实战 一、事故描述 数据库某个表A其中用到了二进制字段&#xff0c;本来就无比巨大&#xff0c;再加上某个客户端阶段发生程序BUG&#xff0c;无限反复插入重复数据&#xff0c;导致一个大表一下午时间迅速…

网络地址转换协议NAT

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

Java剖析 : HashMap底层存储数据的结构 | HashSet添加不重复元素底层原理

HashSet底层剖析 前言&#xff1a; 我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; ★ HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c…

2024年春招助学活动:一批FPGA高端项目让你轻松拿到大厂offer

这里写目录标题 1、前言2、FPGA行业现状3、简历怎么写4、FPGA高端项目4.1 图像类&#xff1a;FPGA图像缩放多路视频拼接4.2 通信类&#xff1a;千兆网UDP协议栈4.3 通信类&#xff1a;万兆网UDP协议栈4.4 图像通信综合&#xff1a;FPGA图像缩放UDP网络视频传输4.5 图像高速接口…

Sora背后的技术《可控生成与文本到图像扩散模型》

在迅速发展的视觉生成领域中&#xff0c;扩散模型革命性地改变了景观&#xff0c;以其令人印象深刻的文本引导生成功能标志着能力的重大转变。然而&#xff0c;仅依赖文本来条件化这些模型并不能完全满足不同应用和场景的多样化和复杂需求。认识到这一不足&#xff0c;多项研究…

day41 动态规划part3

343. 整数拆分 中等 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 但是dp[0] 和 dp[1]为什么是0值得讨论&#xff0c;或者说不用讨论&#xff0c;压根…

Anybus获得IEC 62443-4-1工业网络安全标准ML3认证

HMS 工业网络旗下 Anybus 品牌已成功获得国际电工委员会&#xff08;IEC&#xff09;62443-4-1&#xff1a;安全产品开发生命周期要求&#xff08;一项工业网络安全标准&#xff09;的 3 级成熟度&#xff08;ML3&#xff09;认证。 该认证由全球知名的测试服务提供商 TV Rhein…