算法刷题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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文解读】多模态大语言模型综述

目录 一、简要介绍 二、概要 三、方法 3.1.多模态指令调整 3.1.1介绍 3.1.2初步研究 3.1.3模态对齐 3.1.4数据 3.1.5模态桥接 3.1.6评估 3.2多模态的上下文学习 3.3.多模态的思维链 3.3.1模态桥接 3.3.2学习范式 3.3.3链配置 3.3.4生成模式 3.4.LLM辅助视觉推理…

(golang)切片何时会创建新切片或影响原切片

什么时候切片操作会影响原切片 // 1.切片后没有触发slice的扩容机制时 什么时候对切片操作会创建新切片不影响原切片 // 2.对切片头元素进行截取的时候 // 3.当使用append时&#xff0c;len > cap则会触发扩容机制 前置&#xff1a; //slice结构体 type SliceHeader struct…

【你也能从零基础学会网站开发】Web建站之javascript入门篇 JavaScript事件处理

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 什么是DHTML …

宏工科技数智方案现先进陶瓷展,VR体验数字工厂引关注

3月6-8日&#xff0c;第十六届中国国际粉末冶金、硬质合金与先进陶瓷展览会在上海举行。本届展会&#xff0c;宏工科技股份有限公司携VR体验数字工厂和正负压气力输送系统惊艳亮相&#xff0c;“现实虚拟”的呈现方式收获众多行业客户及专业观众高度关注。 展会汇聚了来自粉末冶…

【Python】一文详细介绍 plt.rc_context() 在 Matplotlib 中的原理、作用、注意事项

【Python】一文详细介绍 plt.rc_context() 在 Matplotlib 中的原理、作用、注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&a…

在funtion中用分号间隔还是逗号间隔

问: 回答: 这段代码是一个Vue组件方法的实现&#xff0c;名为resetForm。该方法的主要作用是关闭一个对话框&#xff08;通过设置this.dialogFormVisible false&#xff09;&#xff0c;重置表单字段&#xff08;使用this.$refs[formName].resetFields();&#xff09;&#x…

动态规划课堂5-----子序列问题(动态规划 + 哈希表)

目录 引言&#xff1a; 例题1&#xff1a;最长递增子序列 例题2&#xff1a;最长定差子序列 例题3&#xff1a;最长的斐波那契子序列的长度 例题4&#xff1a;最长等差数列 例题5&#xff1a;等差数列划分II-子序列 结语&#xff1a; 引言&#xff1a; 要想解决子序列问…

如何有效利用代理IP保护隐私并突破网络限制

有效利用代理IP保护隐私并突破网络限制通常涉及以下几个步骤和注意事项&#xff1a; 1. 选择合适类型的代理&#xff1a; - 高度匿名代理&#xff1a;这是最佳选择&#xff0c;因为它不会在HTTP头部透露任何关于你是通过代理访问的信息&#xff0c;因此可以最大程度地保护你的原…

二维卡通数字人解决方案

美摄科技&#xff0c;凭借在数字人领域的深厚积累与不断创新&#xff0c;为企业量身定制了一套高效、灵活的二维卡通数字人解决方案&#xff0c;助力企业打造独具特色的品牌形象&#xff0c;提升用户互动体验。 美摄科技的二维卡通数字人解决方案&#xff0c;以Live 2D等先进工…

JS 事件捕获、事件冒泡、事件委托

js事件机制在开发中可以说时刻使用&#xff0c;例如dom绑定事件、监听其自身事件等。js事件机制有事件捕获、事件冒泡俩种机制&#xff0c;我们分别说下这俩种机制的使用场景。 一、概念 事件捕获顺序如下&#xff1a; window > document > body > div 事件冒泡顺序…

Codeforces Round 933 (Div. 3)C:Rudolf and the Ugly String

题目链接&#xff1a;Dashboard - Codeforces Round 933 (Div. 3) - Codeforces 解题思路&#xff1a; 解题思路&#xff1a; 题目大概意思是字符串中最少去掉几个单词可以使字符串变漂亮&#xff0c;其实只要找“map"和”pie“这两个单词数量&#xff0c;注意判断&quo…

32个关键字详解①(C语言)

目录 关键字分类&#xff1a; 第一个C程序 - 补充内容 变量的定义与声明 - 补充内容 变量的分类 - 补充内容 变量的作用域 - 补充内容 变量的生命周期 - 补充内容 auto 关键字 register 关键字 static 关键字 static 修饰变量&#xff1a; static修饰函数 sizeof 关键字 基本数…

罐头鱼AI短视频矩阵营销|视频批量剪辑|矩阵系统

AI批量视频剪辑系统是一款功能丰富的视频编辑软件&#xff0c;提供了以下主要功能&#xff1a; 首页显示&#xff1a;在首页上显示用户的登录状态、已绑定的账号数量以及最近上传的视频素材和新上传素材列表。 抖音账号绑定功能&#xff1a;用户可以绑定抖音账号&#xff0c;Q…

读书笔记之《人工智能全球格局》:人工智能时代的中国之路

《人工智能全球格局&#xff1a;未来趋势与中国位势》的作者:是国务院发展研究中心国际技术经济研究所 / 中国电子学会 / 智慧芽&#xff0c; 2019年出版。 这本书全面深入地探讨了人工智能&#xff08;AI&#xff09;的发展历程、当前状态、未来趋势以及中国在这一领域的地位和…

CAN一致性测试:物理层测试之位时间测试

从本周开始结合工作实践&#xff0c;给大家总结CAN一致性相关的测试 包括&#xff1a;物理层、数据链路层、应用层三大块知识点 CAN一致性测试:物理层测试之位时间测试 试验目的&#xff1a;测试控制器输出的差分电平位信号的特征。 试验依据&#xff1a;GMW3122&#xff0…

原生JavaScript,根据后端返回扁平JSON动态【动态列头、动态数据】生成表格数据

前期准备&#xff1a; JQ下载地址&#xff1a; https://jquery.com/ <!DOCTYPE html> <html><head><meta charset"utf-8"><title>JSON动态生成表格数据,动态列头拼接</title><style>table {width: 800px;text-align: cen…

Python 记录日志

1.效果如下&#xff1a; 2.代码如下&#xff1a; import logging import threading import os import sys sys.path.append(os.getcwd())class Mylog(object):_instance_lock threading.Lock()def __init__(self):#,path "log.txt"):# 配置日志输出格式path os.…

(番外)如何将cuda数据存入std::queue实现异步效果

文章目录 1、std::queue列队如何实现异步&#xff1f;2、std::queue可以存储哪些数据类型&#xff1f;2.1、queue如何存放位于cuda上的数据2.2、如何从queue读取位于cuda上的数据&#xff1f;2.3、注意&#xff1a;需要的最大显存 3、一种更优的方法 1、std::queue列队如何实现…

基于SWOT法的信阳本土房地产企业现状及对策分析

目 录 摘要 1 Abstract 1 1绪论 2 2信阳市房地产企业概述 2 2.1中小城市房地产企业概念 2 2.2信阳本土房地产企业定位 3 2.2.1信阳市概况 3 2.2.2信阳市城市规划 3 2.2.3信阳房地产企业概况 4 2.3信阳市本土房地产企业特点 5 2.4研究信阳市本土房地产企业的必要性 6 3运用SWOT…

KBP310-ASEMI新能源整流桥KBP310

编辑&#xff1a;ll KBP310-ASEMI新能源整流桥KBP310 型号&#xff1a;KBP310 品牌&#xff1a;ASEMI 封装&#xff1a;KBP-4 正向电流&#xff08;Id&#xff09;&#xff1a;3A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;60A …
最新文章