简单算法问题
一些简单实用的小算法
He_xj
一枚努力学习的同学
展开
-
潜水员 --二维费用背包问题
题目链接 -----> 潜水员这个题目一开始看得我匪夷所思这个题目也可以是看做,有条件的二维费用背包问题 吧条件如下1.氧气至少为 m2.氮气至少为 n3.所用的气缸的体积要尽可能的小从上述的条件中 存在 至少这个字眼 那么这个问题要如何解决呢因为存在至少所以肯定存在某种情况使得这个气缸中的气体的体积大于所需要的气体的体积,那我们怎么做呢?这个时候就要用到 y总说的了: 用0来代替体积为负数的情况因为 当这个体积是 负数的时候说明此时的气体已经够用了,所以我们可以直接用*原创 2022-05-16 17:45:06 · 208 阅读 · 0 评论 -
洛谷P4017 最大食物链计数 --- 拓扑排序
题目直达 ——> 最大食物链计数一开始以为是 并查集 当我写了一半才发现是要一整条链, 所以就想到了 拓扑排序 😦Before anything else:什么是拓扑排序?那么咱就来说一下对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列原创 2022-05-15 21:21:45 · 470 阅读 · 0 评论 -
洛谷 P3916 图的遍历 -- 反向存图 + dfs暴力求解
题目直达 ----》 图的遍历这个题主要是采用反向存图的操作;然后使用DFS进行遍历整个图即可如果当前图已经遍历过了就return否则就继续遍历将答案存入数组res中就可以了#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 100010;vector<int>m原创 2022-05-15 20:33:53 · 169 阅读 · 0 评论 -
洛谷 P1164 小A点菜 --背包问题求方案数
这个题目主要考察背包问题求方案数题目链接 ----》 小A点菜由于所有的菜品都只能够选一次 所以这就是一个朴素无华的01背包其实这是一个很好的摸板题首先我们知道 01背包的一般动态规划方程f[i][j] = max(f[i - 1][j], f[i - 1][j - 1])由于 i 是线性的所以我们可以优化到f[j] = max(f[j], f[j - 1])那么这个题其实就是 01背包求方案数因为每次得到的 max 中的是当前的 V 可以装下多少的 物品M那么我们转换一下,假设不要钱原创 2022-05-15 18:49:20 · 257 阅读 · 0 评论 -
洛谷 P1464 Function -- 记忆化搜索
这个题采用了记忆化搜索(Memory search)topic’s Link ----》 FunctionFirstly:了解一下记忆化搜索:记忆化搜索是一种通过记录已经遍历过的状态的信息,从而避免对同一状态重复遍历的搜索实现方式。其中从而避免对同一状态重复遍历的搜索实现方式这个一个特点在本题体现在if(dp[a][b][c] != -1; return dp[a][b][c]其实就是当这个点被搜到了,然后你发现这个点其实已经被搜索过了,就直接返回他的值,从而就避免了被重复搜索。注意: 因为原创 2022-05-15 18:29:01 · 294 阅读 · 0 评论 -
洛谷 P1002 [NOIP2002 普及组] 过河卒 动态规划
题目链接 ----> 过河卒这个题考察的是动态规划卒行走的规则:可以向下、或者向右这是题目给出的提示,根据这个我们就可以得到这个题目的状态转移方程为:f[i][j] = f[i - 1][j] +f[i][j - 1]这个表示的就是一共有多少种情况走到(i, j)这个点比如说:给定一个点A:(a,b)那么就有俩个方向(往下走到A点和往右走走到A点)能够走到A:(a, b)这个点的位置;因此上面的状态转移方程是成立的然后题目又说 马会拦住卒的去路,所以 马 能去的地方都是要标记的(就是兵不原创 2022-05-15 17:35:01 · 309 阅读 · 0 评论 -
Kruskal算法求解最小生成树
Kruskal 算法的思路还是非常的简单的先将所有的边都用一个结构体存起来经所有的边按照权重排序即可(因为我们要求的其实就是极小连通子图,所以我们排序后可以直接对边进行连接即可,因为我们将所有的点都放入集合后,得到的边权之和一定是最小的)最后就是函数内部实现,既然我们谈到了 集合中,那么如何判断这个点是否在集合内部呢? 这是我们就可以使用并查集这个算法了。//并查集int find(int x){ if(x != p[x]) return p[x] = find(p[x]);//路径压缩原创 2022-05-10 20:54:44 · 219 阅读 · 0 评论 -
信息学奥赛一本通--城堡问题
这题其实很简单原题链接 --------------》 点击我折磨自己这个题目搞就搞在他给你的输入让你摸不着头脑;就拿11来说吧,因为11可以分解成11 = 8 + 2 + 1也就是说在这个位置的west,northandsouth都有墙也就是说他是这样子的 wallwall 空间 wall就是这样子的我们将11转换为二进制后会发现 (11)2(11)_2(11)2 ----> 1101 是不是很神奇然后我们将整个东北西南方向写成dx[] = {0, -1原创 2022-05-12 21:01:15 · 143 阅读 · 0 评论 -
染色法判定二分图
EASY题目来自Acwing.com这个题目主要是要搞清楚“二分图”的定义,以及如何判断二分图 二分图 ;就很好做了首先,染色法嘛;所以我们给第一个点染上颜色 1;然后给所有与一号店联通的点染上颜色 2;再给 染上2号点的所有的连通的点染上颜色 1;如此循环,假设存在一个奇数边的环那么我们可以轻而易举的推测出,开始的那个点会被染上俩个颜色因此:存在奇数条边的环(奇数环)不可能是二分图,具体的证明可以看那个链接代码如下:Code:#include <iostream&g原创 2022-05-10 20:46:47 · 124 阅读 · 0 评论 -
博弈论(NIM游戏)
这个题目还是非常有意思的首先 先手的状态有三种先手必赢: 先手的下一个状态是必输状态(也就是说先手拿完以后的下一个状态是必输状态)先手必败:1. 先手的下一个状态是必赢状态(这跟着上面的想也能想出来吧)2. 没有后继状态的话也是先手必输(因为先手拿完以后就没有后继状态了,所以先手拿的一定是最后一个,所以必输)我们可以使用异或运算来解决这个问题没有后继状态就是 0 ^ 0 ^ 0 ^ 0 = 0这样的话开局就是0所以先手根本无法下手 —》 必输!!先手的下一个状态是必输状态))原创 2022-05-10 20:43:09 · 478 阅读 · 0 评论 -
线性筛法求前N个数的欧拉函数之和
首先回顾线性筛法void get_prime(int n){ for( int i = 2 ; i <= n; i++ ) { if(!st[i]) primes[++cnt] = i; for( int j = 1 ; primes[j] <= n / i ; j++ ) { st[i * primes[j]] = true; if( i % primes[j] == 0 ) b原创 2022-05-08 20:48:07 · 251 阅读 · 0 评论 -
二分图的最大匹配
这是一个非常有意思的题目(doge)题目链接 ----》配对题目的过程大致如下:1.先把所有的边都存入邻接表中2.开始遍历每一个男孩的心仪的女孩3.如果这个女孩还没有和别人在一起,那么就选择这个女孩做女朋友 || 如果这个女孩(ali)已经有男朋友了,那么就反向搜索她的那个男朋友(bob)``paring[i]是否还有另外的女孩(kel)没有男朋友并且bob正好对kel也有好感,那么就拆散bob和ali让bob和kel再一起,然后再让ali和eric(新加入的男孩)在一起就可以了4..原创 2022-05-08 19:19:59 · 56 阅读 · 0 评论 -
最小生成树Prim算法
代码思路来自AcWingWhat is theMin spaning tree ? -----》Click this to know the answer测试样例Input:4 51 2 11 3 21 4 32 3 23 4 4Output:6The Code:#include <iostream>#include <vector>#include <cstring>using namespace std;c..原创 2022-05-08 13:36:15 · 131 阅读 · 0 评论 -
USACO 回文质数
题目描述因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。写一个程序来找出范围 [a,b] (5 <=a < b<= 100,000,000)( 一亿)间的所有回文质数。输入格式第 1 行: 二个整数 a 和 b .输出格式输出一个回文质数的列表,一行一个。输入输出样例输入 #15 500输出 #15711101131151181191313353373383本题原创 2022-02-03 14:14:59 · 511 阅读 · 0 评论 -
最长连续不重复子序列(双指针算法)
双指针简易算法原创 2021-12-19 21:33:47 · 377 阅读 · 0 评论 -
蓝桥杯 算法提高 淘淘的名单
算法提高 淘淘的名单描述 by ZBY... :) 淘淘拿到了一份名单,他想对上面的名字进行处理,挑出一些特殊的名字,他请你来帮忙。 淘淘关注以下名字: 如果这个名字是“WYS”,他希望你的程序输出“KXZSMR”。 如果这个名字是“CQ”,他希望你的程序输出“CHAIQIANG”。 如果这个名字是“LC“,他希望你的程序输出“DRAGONNET”。 如果这个名字是“SYT”或“SSD”或“LSS”或“LYF”,他希望你的程序输出“STUDYFATHER”。 如果这个名字原创 2021-11-02 12:35:46 · 143 阅读 · 0 评论 -
判断子序列(Acwing双指针算法第二弹)
给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。请你判断 a 序列是否为 b序列的子序列。子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5}的一个子序列。输入格式第一行包含两个整数 n,m。第二行包含 n 个整数,表示 a1,a2,…,an。第三行包含 m 个整数,表示 b1,b2,…,bm。输出格式如果 a 序列是 b序列的子序列,输出一行 Yes。否则..原创 2021-12-21 19:31:36 · 253 阅读 · 0 评论 -
CF 920A Water the Garden
CF 920A原创 2022-04-01 21:37:54 · 258 阅读 · 0 评论 -
高精度加法
给定两个正整数(不含前导00),计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤1000001输入样例:1223输出样例:35由于数值越界,所以高精度的加法只能在字符串中进行;下面的代码是将字符数组转化为整数数组存入新的数组A中。其中push_back()是将数字放在A数组的最后一位。for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'..原创 2021-12-27 20:50:36 · 335 阅读 · 0 评论 -
全排列问题(数字全排列)
数字排列,全排列原创 2022-01-25 00:03:38 · 625 阅读 · 0 评论 -
USACO 牛的基因学
题目来源:ACWING 每日一题;翻译: 无敌的yxc本题就是暴力枚举(遇事不决,暴力美学)把每一个字符串输入代码所示has数组存储有斑点牛,no存无斑点牛。(顾名思义)然后用一个媒介数组hash(因为有哈希的原理所以叫hash了)第一步找has中的基因序列,必须满足所有无斑点牛中某一个位置的所有基因都和有斑点牛的不相同(可以读题来理解样例3 8AATCCCATGATTGCAAGGTCGCAA//有斑点ACTCCCAGACTCGCATACTTCCAT/...原创 2022-02-03 21:54:02 · 385 阅读 · 0 评论 -
离散化(简单版)
例题:区间和:假定有一个无限长的数轴,数轴上每个坐标上的数都是0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r]之间的所有数的和。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含两个整数 x 和 c。再接下来 m 行,每行包含两个整数 l 和 r。输出格式共 m行,每行输出一个询问中所求的区间内数字和。数据范围−1000000000≤x≤10000000原创 2021-12-22 20:40:50 · 1043 阅读 · 1 评论 -
NOIP2004 提高组 合唱队形
NOIP 2004提高组 合唱队形原创 2022-04-01 21:42:15 · 615 阅读 · 0 评论