算法刷题day16

目录

  • 引言
  • 一、小朋友排队
  • 二、仓库规划
  • 三、股票买卖II

引言

关于这个树状数组和线段树还是挺重要的,主要题目不会直接问你求哪个区间的和什么的,题目往往是给出一个真实的例子,隐藏这些操作条件,需要让你自己去抽象出来这些操作,然后再来判断到底用什么数据结构和算法,所以刷题的好处就在于此,有些题自己根本就想不到还能这样做,所以只有不断地见大量的习题才行。


一、小朋友排队

标签:贪心、树状数组、排序

思路1:这道题跟冒泡排序差不多所以就按冒泡排序做了做,超时了,只能过 5 / 11 5/11 5/11 的数据,但蓝桥杯的话还是能拿到分数的。
思路2:这道题首先是有 k k k 个逆序对,所以至少要交换 k k k 次,而由于冒泡排序就是交换 k k k 次,所以我们可以得知最优解肯定是交换 k k k 次。由于存在一种交换策略使得程度最小,并且如果一个数,前面有 k 1 k_1 k1 个数比它大,后面有 k 2 k_2 k2 个数比它小,那么这个数至少要移动 k 1 + k 2 k_1+k_2 k1+k2 次,那么所有的这样的数加起来就是 2 k 2k 2k 次,因为相当于每个逆序对都算了两次,又由于最优解是交换 k k k 次,那么整个数列的移动最优解就是 2 k 2k 2k 次,那么所以这个算法就成立。只要找到每个数前面有 k 1 k_1 k1 个数比它大,后面有 k 2 k_2 k2 个数比它小,就知道这个数移动了 k 1 + k 2 k_1+k_2 k1+k2 次,再根据高斯求和公式就能算出不高兴程度了。这个可以用树状数组动态的求前缀和,从前往后插,高度为下标,元素为人数,每次查找 h [ i ] h[i] h[i] 后面有多数人,就能知道前面有多少人更大,从后往前插,每次查找 h [ i ] h[i] h[i] 前面的人就知道后面有多少人比它小。

题目描述:

n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是 0。如果某个小朋友第一次被要求交换,则他的不高兴程度增加 1,如果第二次要求他交换,则他的不高兴程度增加 2(即不高兴
程度为 3),依次类推。当要求某个小朋友第 k 次交换时,他的不高兴程度增加 k。请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。输入格式
输入的第一行包含一个整数 n,表示小朋友的个数。
第二行包含 n 个整数 H1,H2,…,Hn,分别表示每个小朋友的身高。输出格式
输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。数据范围
1≤n≤100000,0≤Hi≤1000000
输入样例:
3
3 2 1
输出样例:
9
样例解释
首先交换身高为3和2的小朋友,再交换身高为3和1的小朋友,再交换身高为2和1的小朋友,每个小朋友的不高兴程度都是3,总和为9。

示例代码一: 5/11

#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;const int N = 1e5+10;int n;
int h[N];
LL res[N];
int cnt[N];int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &h[i]);for(int i = 0; i < n - 1; ++i){int count = 0;for(int j = 0; j < n - i - 1; ++j){if(h[j] > h[j+1]){cnt[j]++, cnt[j+1]++;res[j] += cnt[j], res[j+1] += cnt[j+1];swap(h[j], h[j+1]);swap(cnt[j], cnt[j+1]);swap(res[j], res[j+1]);count++;}}if(count == 0) break;}LL ans = 0;for(int i = 0; i < n; ++i) ans += res[i];cout << ans << endl;return 0;
}

示例代码2: 11/11

#include <cstdio>
#include <cstring>
#include <iostream>using namespace std;typedef long long LL;const int N = 1e6+10;  //以高度为下标所以要一百万int n;
int h[N], tr[N];  //h[i]:第i号人的高度  tr[i]:高度为i的人数
int sum[N];  //sum[i]:第i号人前后的人数int lowbit(int x)
{return x & -x;
}void add(int x, int v)
{for(int i = x; i < N; i += lowbit(i)) tr[i] += v;
}int query(int x)
{int res = 0;for(int i = x; i; i -= lowbit(i)) res += tr[i];return res;
}int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &h[i]), h[i]++;  //因为高度可能为0,而前缀和下标只能从1开始for(int i = 0; i < n; ++i){sum[i] = query(N-1) - query(h[i]);  //找前面更大的add(h[i], 1);  //高度为h[i]的多了一人}memset(tr, 0, sizeof tr);  //清空tr数组for(int i = n - 1; i >= 0; --i){sum[i] += query(h[i] -1);  //找后面更小的add(h[i], 1);}LL res = 0;for(int i = 0; i < n; ++i) res += (LL)sum[i] * (sum[i] + 1) / 2;  //移动了sum[i]次计算每个人的不高兴程度cout << res << endl;return 0;
}

二、仓库规划

标签:枚举

思想:这道题挺简单的,直接枚举就行了, n n n O ( M N 2 ) O(MN^2) O(MN2) ,数据范围也是允许暴力的,所以直接写。

题目描述:

西西艾弗岛上共有 n 个仓库,依次编号为 1∼n。每个仓库均有一个 m 维向量的位置编码,用来表示仓库间的物流运转关系。具体来说,每个仓库 i 均可能有一个上级仓库 j,满足:仓库 j 位置编码的每一维均大于仓库 i 位置编码的对应元素。比如编码为 (1,1,1) 的仓库可以成为 (0,0,0) 的上级,但不能成为 (0,1,0) 的上级。如果有多个仓库均满足该要求,则选取其中编号最小的仓库作为仓库 i 的上级仓库;如果没有仓库满足条件,则说明
仓库 i 是一个物流中心,没有上级仓库。现给定 n 个仓库的位置编码,试计算每个仓库的上级仓库编号。输入格式
输入共 n+1 行。
输入的第一行包含两个正整数 n 和 m,分别表示仓库个数和位置编码的维数。
接下来 n 行依次输入 n 个仓库的位置编码。其中第 i 行(1≤i≤n)包含 m 个整数,表示仓库 i 的位置编码。输出格式
输出共 n 行。
第 i 行(1≤i≤n)输出一个整数,表示仓库 i 的上级仓库编号;如果仓库 i 没有上级,则第 i 行输出 0。数据范围
50% 的测试数据满足 m=2;全部的测试数据满足 0<m≤100<n≤1000,且位置编码中的所有元素均为绝对值不大于 106的整数。输入样例:
4 2
0 0
-1 -1
1 2
0 -1
输出样例:
3
1
0
3
样例解释
对于仓库 2(1,1) 来说,仓库 1(0,0) 和仓库 3(1,2) 均满足上级仓库的编码要求,因此选择编号较小的仓库 1作为其上级。

示例代码:

#include <cstdio>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1010;int n, m;
int w[N][10];int main()
{scanf("%d%d", &n, &m);for(int i = 0; i < n; ++i){for(int j = 0; j < m; ++j){scanf("%d", &w[i][j]);}}for(int i = 0; i < n; ++i){int res = 0;for(int j = 0; j < n; ++j){bool flag = true;for(int k = 0; k < m; ++k){if(w[i][k] >= w[j][k]){flag = false;break;}}if(flag){res = j+1;break;}}printf("%d\n", res);}return 0;
}

三、股票买卖II

标签:贪心

思路:这道题就是贪心,如果明天涨了,那么今天就买。

题目描述:

给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。输入格式
第一行包含整数 N,表示数组长度。
第二行包含 N 个不大于 10000的正整数,表示完整的数组。输出格式
输出一个整数,表示最大利润。数据范围
1≤N≤105
输入样例16
7 1 5 3 6 4
输出样例17
输入样例25
1 2 3 4 5
输出样例24
输入样例35
7 6 4 3 1
输出样例30
样例解释
样例1:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 
= 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获
得利润 = 6-3 = 3 。共得利润 4+3 = 7。样例2:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润= 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。样例3:在这种情况下, 不进行任何交易, 所以最大利润为 0

示例代码:

#include <cstdio>
#include <iostream>using namespace std;typedef long long LL;const int N = 1e5+10;int n;
int w[N];int main()
{scanf("%d", &n);for(int i = 0; i < n; ++i) scanf("%d", &w[i]);LL res = 0;for(int i = 1; i < n; ++i) {if(w[i] > w[i-1]) res += w[i] - w[i-1];}printf("%lld\n", res);return 0;
}

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

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

相关文章

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

Java,SpringBoot中对Stream流的运用

详细参考&#xff1a;java 1.8 stream 应用-22种案例_java1.8 流案例-CSDN博客 准备条件 public class Books implements Serializable {private static final long serialVersionUID 1L;/*** 图书记录ID&#xff0c;自增*/private Integer bookId;/*** 图书号*/private Str…

顺序表经典算法及其相关思考

27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 思路一 利用顺序表中的SLDestroy函数的思想&#xff0c;遇到等于val值的就挪动 思路二 双指针法&#xff1a;不停的将和val不相等的数字往前放。此时的des更像一个空数组&#xff0c;里面存放的都是和val不相等、能够存…

【人工智能学习思维脉络导图】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 知识图谱1. 基础知识2.人工智能核心概念3.实践与应用4.持续学习与进展5.挑战与自我提升6.人脉网络 知识图谱 人工智能学习思维脉络导图 1. 基础知识 计算机科学基础数学基础&#xff08;线性代数、微积分、概率论和统计学…

先进语言模型带来的变革与潜力

用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动&#xff0c;开启通往知识宝库的大门&#xff0c;即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型&#xff0c;能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…

第十四章[面向对象]:14.5:访问限制/属性

一,动态添加属性/方法 1,动态添加实例属性和实例方法 from types import MethodTypeclass Student:passs = Student()# 动态添加属性 s.name = Tom print(s.name) print(s.__dict__)# 定义一个函数作为实例方法 def set_age(self, age):self.age = age# 动态添加方法 s.set_…

Nginx基础入门

一、Nginx的优势 nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个SMTP&#xff08;邮局&#xff09;服务器。 Nginx的web优势&#xff1a;IO多路复用&#xff0c;时分多路复用&#xff0c;频分多路复用 高并发&#xff0c;IO多路复用&#xff0c;epoll&#xf…

【LeetCode】70. 爬楼梯(简单)——代码随想录算法训练营Day38

题目链接&#xff1a;70. 爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到…

[OpenGL教程05 ] glAccum() 函数对累积缓存设置

Accumulation Buffer&#xff1a;累积缓存 一、说明 openGL编程之所以困难&#xff0c;是因为它是三维图表示&#xff1b;简简单单加入一个Z轴&#xff0c;却使得几何遮挡、光线过度、运动随影等搞得尤其复杂。它的核心处理环节是像素缓存&#xff0c;本篇的积累缓存就是其一个…

【MySQL】学习连接查询和案例演示

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KOxr1rwR9cQTlydJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

OD(8)之Mermaid流程图(flowcharts)使用详解

OD(8)之Mermaid流程图(flowcharts)使用详解 Author: Once Day Date: 2024年2月20日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍…

聊一聊bpmn-js中的依赖注入框架didi

最近在用bpmn-js来进行flowable流程图的开发工作,不可避免地希望对其运行机制做一个大致的了解,在使用bpmn-js的过程中,bpmn-js基于diagram-js实现的插件式开发方式引起了我的兴趣。于是通过查阅源码希望对齐进一步了解发现:diagram-js是基于一个叫didi的实现的依赖注入功能…

C#通过泛型方法的重载分别调用主窗体和提示窗体

目录 一、涉及到的知识点 1.泛型方法的重载 2.使用泛型更好地实现通用化 二、示例&#xff1a;泛型方法及其重载 1.源码 2. 生成效果 实际开发项目时&#xff0c;有时会因为调用窗体或提示窗体过多&#xff0c;而难于管理&#xff0c;这时&#xff0c;可以通过泛型方法的…

【力扣hot100】刷题笔记Day8

前言 到了大章节【链表】了&#xff0c;争取两三天给它搞定&#xff01;&#xff01; 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;】 双指针 参考题解&#xff0c;相比于求长度右对齐再一起出发的方法简洁多了 class Solution:def getIntersectionNode(self, head…

2024年华为OD机试真题-测试用例执行计划-Java-OD统一考试(C卷)

题目描述: 某个产品当前迭代周期内有N个特性( F1,F2,.......FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例(T1,T2......,TM ),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例…

基于FPGA的二维DCT变换和逆变换verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 数据导入到matlab显示图像 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer:…

win32 汇编读文件

做了2个小程序&#xff0c;没有读成功&#xff1b;文件打开了&#xff1b; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

2024-02-21 学习笔记(DETR)

自动多模态检测验证效果不佳&#xff08;过检太多&#xff09;后&#xff0c;节后开始尝试DETR路线。 基本梳理了下DETR发展和验证的脉络&#xff0c;先进行相应指定场景的效果验证。 关于DETR系列的介绍&#xff0c;B站上比较多&#xff0c;迪哥的都讲的比较细。 推荐大佬的…

如何在java中使用 Excel 动态函数生成依赖列表

前言 在Excel 中&#xff0c;依赖列表或级联下拉列表表示两个或多个列表&#xff0c;其中一个列表的项根据另一个列表而变化。依赖列表通常用于Excel的业务报告&#xff0c;例如学术记分卡中的【班级-学生】列表、区域销售报告中的【区域-国家/地区】列表、人口仪表板中的【年…

代码随想录Day58 | 392.判断子序列 115.不同的子序列

代码随想录Day58 | 392.判断子序列 115.不同的子序列 392.判断子序列115.不同的子序列 392.判断子序列 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列 状态 本题实际上上还是寻找最长…