CSP赛前复习总结

news2024/11/19 4:47:50

文章目录

  • 时空复杂度分析
  • 算法回顾
    • 基础算法
      • 贪心
        • 删数问题
          • 题目描述
          • 输入格式
          • 输出格式
          • 样例输入
          • 样例输出
      • 贪心问题的具体应用
      • 双指针
      • 二分
        • 例题
      • 分治
    • 数据结构
    • 做题经历(低级错误)
      • 先从周考题说起
        • First
        • Second

还有一两天就CSP了,特此为近期的复习进行总结。

时空复杂度分析

对于时空复杂度分析是算法竞赛中一个非常重要的环节,因为我们可以通过题目所给的时间限制去推导实现该题目所需要用的算法内容。
下面举几个例子:
n n n 是一个非常小常数时, 30 30 30 以下的 n n n 一般时间复杂度就是指数级别的,类似的算法有状压dp。
n ≤ k × 1 0 2 ( k ≤ 500 ) n\leq k\times 10^{2}(k\leq 500) nk×102(k500) 时,可能就是 Θ ( n 3 ) \Theta(n^3) Θ(n3) 的算法实现,例如一些dp和弗洛伊德算法。
n ≤ 1 0 3   o r   4 n\leq 10^{3\ or\ 4} n103 or 4 的时候,该算法的时间复杂度一般是 Θ ( n 2 ) \Theta(n^2) Θ(n2),例如dp和匈牙利算法(匈牙利算法虽然理论上应该是 Θ ( n 3 ) \Theta(n^3) Θ(n3) 但是实则却能跑出平方甚至更低的时间复杂度)等。
n ≤ 1 0 6 n\leq 10^6 n106 左右时一般都是 Θ ( n   l o g   n ) \Theta(n\ log\ n) Θ(n log n) 的算法,此事件复杂的的算法有很多,例如求最短路的dijkstra堆优化和SPFA,还有线段树和树状数组都是(树状数组所带的常数要小于线段树)。
……
然而平时考试的也不需要怎么考虑空间限制,只要不把数组开的指数级别或者是递归爆栈应该没什么。
综上所述,分析时空复杂度是一个很重要的东西。

算法回顾

基础算法

最近复习了一些基础算法,包括贪心,二分,双指针之类的。

贪心

删数问题
题目描述

键盘输入一个高精度的正整数 N N N(不超过 250 250 250 位),去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N k k k,寻找一种方案使得剩下的数字组成的新数最小。

输入格式

输入两行正整数。
第一行输入一个高精度的正整数 n n n
第二行输入一个正整数 k k k,表示需要删除的数字个数。

输出格式

输出一个整数,最后剩下的最小数。

样例输入
175438 
4
样例输出
13

这道题的意思就是给定一个数字,求删除 k k k 个数之后的最小值,很明显这是一道很简单的贪心,贪心的主要过程如下

for (int i = 1; i <= n; i++) {
	a[i] = num[i - 1] - '0';
}
rest = n - k;
while (cnt < rest) {
	minp = t;
	for (int i = t; i <= k + t; i++) {
		if (a[minp] > a[i]) {
			minp = i;
		}
	}
	if (a[minp]) {
		flag = 1;
	}
	if (flag) {
		cout << a[minp];
	}
	k -= minp - t;
	t = minp + 1;
	cnt++;
}
if (!flag) {
	cout << 0;
}

贪心问题的具体应用

贪心问题中最经典对的运用就是哈夫曼树(哈夫曼树是优先队列来实现的)
哈夫曼树的主要建树思路如下
哈夫曼树
知道了如何建树之后,代码就显而易见了。

#include<bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> >q;
int n, a[10005];
int huffman(int x) {
	int res = 0;
	for (int i = 0; i < n - 1; i++) {
		int x = q.top();
		q.pop();
		int y = q.top();
		q.pop();
		int add = x + y;
		res += add;
		q.push(add);
	}
	return res;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		q.push(a[i]);
	}
	cout << huffman(n);
	return 0;
}

双指针

双指针最广泛被人们所知的应用就是快速排序

void qsort(int *arr, int begin, int end) {
	if (begin > end)
		return;
	int tmp = arr[begin];
	int i = begin;
	int j = end;
	while (i != j) {
		while (arr[j] >= tmp && j > i) {
			j--;
		}
		while (arr[i] <= tmp && j > i) {
			i++;
		}
		if (j > i) {
			int t = arr[i];
			arr[i] = arr[j];
			arr[j] = t;
		}
	}
	arr[begin] = arr[i];
	arr[i] = tmp;
	qsort(arr, begin, i - 1);
	qsort(arr, i + 1, end);
}

二分

例题

数列分段题目传送门
数列分段也是二分+贪心运用的一道著名例题

#include<bits/stdc++.h>
using namespace std;
const int MAX = 1000005;
long long n, m, a[MAX], maxn = LONG_LONG_MIN;
long long sum, ans;
bool check(long long mid) {
	int cnt = 1, sum_c = 0;
	for (int i = 1; i <= n; i++)
		if (a[i] + sum_c > mid)
			sum_c = a[i], cnt++;
		else sum_c += a[i];
	return cnt <= m;
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		sum += a[i];
		maxn = max(maxn, a[i]);
	}
	long long l = maxn, r = sum, mid;
	while (l <= r) {
		mid = (l + r) >> 1;
		if (check(mid)) {
			r = mid - 1;
			ans = mid;
		} else {
			l = mid + 1;
		}
	}
	cout << ans << endl;
	return 0;
}

分治

分治思想运用到了很多地方,例如线段树等,这一道分治的例题时我们之前学校的一个周考原题,名字叫做摧毁基地,在洛谷上有原题,现在忘记叫什么了,反正就是一道很经典的分治

#include<bits/stdc++.h>
using namespace std;
long long n, k, a, b, em[100005];
long long solve(long long l, long long r) {
	long long tot;
	long long i = lower_bound(em + 1, em + k + 2, l) - em;
	long long j = upper_bound(em + 1, em + k + 2, r) - em;
	j--;
	if (j < i) {
		return a;
	}
	tot = b * (j - i + 1) * (r - l + 1);
	if (l == r) {
		return tot;
	}
	long long mid = (l + r) >> 1;
	return min((solve(l, mid) + solve(mid + 1, r)), tot);
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> k >> a >> b;
	for (int i = 1; i <= k; i++) {
		cin >> em[i];
	}
	sort(em + 1, em + k + 1);
	em[k + 1] = INT_MAX;
	cout << solve(1, 1 << n);
	return 0;
}

……还有很多复习了的算法,我现在就只列举一些自己已经复习的了算法。

数据结构

数据结构千千万,只不过现在不多了,数据结构就不梳理了,以后会专门整理目前已经学了的数据结构。

做题经历(低级错误)

接下来是一些奇葩的低级错误。

先从周考题说起

First

多米诺骨牌涂色一题中,我把模数少写了个0(悲),经历此事,再也没犯

if(s1[i]==s2[i]){
	if(s1[i-1]==s2[i-1]){
		ans=(ans*2)%1000000007;
	}
}else{
	if(s1[i-1]==s2[i-1]){
		ans=(ans*2)%1000000007;
	}else{
		ans=(ans*3)%1000000007;
	}
	i++;
}

没错,就是少写了个0!!!

Second

在能力测试一题中,我输出,没有输出完。。。。
(未完待续)

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

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

相关文章

运机集团-001288 基本面分析(20231019)

运机集团-001288 基本面分析 基本情况 公司名称&#xff1a;四川省自贡运输机械集团股份有限公司 A股简称&#xff1a;运机集团 成立日期&#xff1a;2003-09-28 上市日期&#xff1a;2021-11-01 所属行业&#xff1a;通用设备制造业 主营业务&#xff1a;以带式输送机为主的节…

计算机操作系统-第十一天

目录 1、进程的状态 创建态与就绪态 运行态 终止态 新建态 结束态 进程状态的转换 进程的组织方式 链接方式&#xff08;常见&#xff09; 索引方式&#xff08;少见&#xff09; 本节思维导图 1、进程的状态 创建态与就绪态 1、进程正在被创建时&#xff0c;处于…

03、爬取资料---但是失败,仅作为记录

1、找网址 进入直播间&#xff0c;里面的用户被设置不对外查看。 如图&#xff0c;找url 2、伪装 user-agent 用户代理 cookie 用户登录后保留的信息 登录信息&#xff1a;找cookie 浏览器信息&#xff1a;找user-agent user-agent 用户代理 cookie 用户登录后保留的信…

kubernetes集群编排

目录 k8s 集群部署 集群环境初始化 所有节点安装kubeadm 拉取集群所需镜像 集群初始化 安装flannel网络插件 设置kubectl命令补齐 k8s 集群部署 实验环境 主机名 ip 角色 k8s1&#xff08;上一章的docker1&#xff09; 192.168.81.10 reg.westos.org&#xff0c;harbor仓库…

机器学习中参数优化调试方法

1 超参数优化 调参即超参数优化&#xff0c;是指从超参数空间中选择一组合适的超参数&#xff0c;以权衡好模型的偏差(bias)和方差(variance)&#xff0c;从而提高模型效果及性能。常用的调参方法有&#xff1a; 人工手动调参 网格/随机搜索(Grid / Random Search) 贝叶斯优…

Kingbase备份与还原及表的约束(Kylin)

备份与还原 逻辑备份是对整个数据库好数据库中的部分对象利用逻辑备份工具导出数据到备份文件在需要数据恢复的情况下利用逻辑还原工具把备份文件恢复到数据库中 使用场景 逻辑备份主要用于数据库逻辑错误的恢复&#xff0c;恢复后对其他数据没有太大影响逻辑备份可用于在大…

Java:ApacheHttpClient连接寿命(timeToLive)未配置问题分析

一、问题描述 若 Apache HttpClient 未设置 timeToLive&#xff0c;通过服务域名访问服务的实例并且服务域名解析出的 IP 发生变化时&#xff0c;在短时间内会有部分请求出现连接异常错误。 二、问题分析 Apache HttpClient 通过服务域名从连接池获取连接&#xff0c;当连接…

IDEA中SpringBoot项目的yml多环境配置

SpringBoot的yml多环境配置 创建多个配置文件 application.yml #主配置文件 application-dev.yml #开发环境的配置 application-test.yml #测试环境的配置在application.yml中添加多环境配置属性 spring:profiles:active: profiles.active项目启动可能不会识别&#x…

简单了解一下:Node的util工具模块

了解util模块&#xff0c;知道怎么使用util来格式化字符串&#xff0c;把对象转化为字符串&#xff0c;检查对象类型。 那么util模块有哪些方法呢&#xff1f;如下图所示&#xff1a; 常用的几个方法&#xff1a; 格式化输出字符串 util提供的格式化方法为&#xff1a;form…

0基础学习PyFlink——模拟Hadoop流程

学习大数据还是绕不开始祖级别的技术hadoop。我们不用了解其太多&#xff0c;只要理解其大体流程&#xff0c;然后用python代码模拟主要流程来熟悉其思想。 还是以单词统计为例&#xff0c;如果使用hadoop流程实现&#xff0c;则如下图。 为什么要搞这么复杂呢&#xff1f; 顾…

快速入门python机器学习

文章目录 机器学习概述1.1 人工智能概述机器学习与人工智能、深度学习1.1.2 机器学习、深度学习能做些什么 1.2 什么是机器学习1.2.1 定义1.2.2 解释1.2.3 数据集构成 1.3 机器学习算法分类1.3.1 总结1.3.2 练习1.3.3 机器学习算法分类 1.4 机器学习开发流程&#xff08;了解&a…

小程序之自定义组件 结合案例

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.自定义组件 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#…

【基础知识补充】三个重要理化参数和计算预测、药代动力学(PK)、毒性预测 / ADME

一、药物理化性质预测 药物的理化性质包括分子的脂溶性、水溶性和解离常数&#xff08;Dissociation Constant&#xff09;pKa&#xff0c;这些理化参数与药代动力学性质、生物活性强度以及作用靶标的选择性密切相关&#xff0c;下面分别介绍。 1、脂溶性&#xff08;logP&am…

数据分析入门

B站&#xff1a;01第一课 数据分析岗位职责和数据分析师_哔哩哔哩_bilibili 一、岗位&#xff1a;数据分析师 Q1 数据分析师在公司做什么工作&#xff1f; 数据来源于公司核心业务&#xff0c;通过监测业务健康度来确定业务的健康状况&#xff1b; 通过对用户精细化分析&am…

一站式智慧校园解决方案 SaaS云平台智慧校园管理系统源码

SaaS云平台 智慧校园管理平台 教师端、家长端、学生端 智慧校园以互联网为基础&#xff0c;以“大数据云服务”为核心&#xff0c;融合校园教学、管理、生活软硬件平台&#xff0c;定义智慧校园新生活。智慧校园管理平台管理者、教师、学生、家长提供一站式智慧校园解决方案&a…

Zynq中断与AMP~双核串口环回之PS与PL通信

实现思路&#xff1a; 额外配置&#xff1a;通过PL配置计数器&#xff0c;向CPU0和CPU1发送硬中断。 1.串口中断CPU0&#xff0c;在中断中设置接收设置好字长的数据&#xff0c;如果这些数据的数值符合约定的命令&#xff0c;则关闭硬中断&#xff0c;并将这部分数据存入AxiLi…

SystemVerilog Assertions应用指南 Chapter1.29“ disable iff构造

在某些设计情况中,如果一些条件为真,则我们不想执行检验。换句话说,这就像是一个异步的复位,使得检验在当前时刻不工作。SVA提供了关键词“ disable iff来实现这种检验器的异步复位。“ disable iff”的基本语法如下。 disable iff (expression) <property definition> …

SystemVerilog Assertions应用指南 Chapter1.31 在属性中使用形参

可以用定义形参( formal arguments)的方式来重用一些常用的属性。属性“arb”使用了4个形参,并且根据这些形参进行检验。其中还定义了特定的时钟。SVA允许使用属性的形参来定义时钟。这样,属性可以应用在使用不同时钟的相似设计模块中。同样的,时序延迟也可以参数化,这使得属性…

微信小程序开发之自定义组件(会议OA项目其他页面搭建)

目录 前言 一、WeChat中的自定义组件 1. 基本概述 2. 包含文件及作用 3. 自定义组件的作用 4.使用步骤&#xff1a; 二、tabs组件及会议管理布局 tabs组件 1. 创建组件 准备 创建 使用组件 会议管理布局 tabs.wxml指定组件模版 tabs.wxss完成样式设计 tabs.js定义属…

Ubuntu docker安装mysql

本文介绍如何在docker中安装mysql&#xff0c;之前有尝试过先在docker中安装一个ubuntu到镜像&#xff0c;然后进去再去安装mysql相关的东西&#xff0c;发现不行&#xff0c;这边整理一下一个可行的方式。 在下载镜像的时候&#xff0c;直接下载mysql镜像。 1.搜索镜像 doc…