CSP赛前复习总结

2023-10-20 05:04
文章标签 总结 csp 复习 赛前

本文主要是介绍CSP赛前复习总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

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

这篇关于CSP赛前复习总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/244861

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000