算法练题笔记
liyihwa____
这个作者很懒,什么都没留下…
展开
-
表达式求值
表达式求值模板代码#include<iostream>#include<stack>#include<map>#include<unordered_map>using namespace std;unordered_map<char,int> priority;stack<int> nums;stack<int> op;string s;void eval(){ int a=nums.top(原创 2022-01-26 17:57:38 · 750 阅读 · 0 评论 -
前缀和+离散化
题目链接:https://www.acwing.com/problem/content/1989/将原题抽象为:找到数轴上计数大于等于2的点的个数代码如下:重点在于如何通过差分数组mp倒推原数组#include<iostream>#include<map>using namespace std;#define ll long longmap<ll,ll> mp;void add(int l,int r){ mp[l]++; mp[r+1原创 2022-01-24 16:39:01 · 461 阅读 · 0 评论 -
计算两点间次短距离
题目来源:https://leetcode-cn.com/problems/second-minimum-time-to-reach-destination/思路: 用两个距离数组,记录出发点到各点的距离其中dis[i][0] 记录最短距离,dis[i][1]记录(严格)次短距离同时维护dis[i][0]和dis[i][1]即可如何维护?我们从队列中取到一个点时,先判断他是否已经计算出次短距离了,如果是就直接抛弃, 然后判断如果他已经被访问过一次(既,已经计算出最短距离) , 判断它的最短距离原创 2022-01-24 10:54:16 · 590 阅读 · 0 评论 -
21/12/14 力扣每日一题
https://leetcode-cn.com/problems/course-schedule-iii/class Solution {public: static bool cmp(vector<int> &a,vector<int> &b){ return a[1]<b[1]; } int scheduleCourse(vector<vector<int>>& courses) {原创 2021-12-14 10:23:45 · 1069 阅读 · 0 评论 -
力扣270场周赛: 树上节点的共同祖先-记录欧拉路径
欧拉路径的记录1.直接枚举class Solution {public: vector<int> findEvenNumbers(vector<int>& d) { // 从给定的所有数字中取出三位偶数,按递增顺序排列 set<int> ans; for(int i=0;i<d.size();i++) { if(d[i]==0) continue;原创 2021-12-05 14:10:25 · 162 阅读 · 0 评论 -
ACWing例题
数组中第k小的数:https://www.acwing.com/problem/content/submission/code_detail/9193612/主要思路:我们采用类似快排的算法,每次给函数指定一个起点l和终点r,我们选取一个哨兵(a[l]),然后进行快排,将它放在合适的位置上,使得它左边的数都比他小,右边的数都比他大。 然后我们判断k与a[l]的位置关系,选择递归处理左半部分/右半部分即可。每次将数组分半,因此复杂度=(n/2+n/4+n/8…)=2n#include<iost原创 2021-12-04 11:55:01 · 377 阅读 · 0 评论 -
二分搜索模板
二分搜索原创 2021-12-03 20:07:00 · 473 阅读 · 0 评论 -
归并排序思想,以及代码实现
归并排序将区间不断二等分,二等分…然后一个接一个合并假设merge_sort(int a[],int l,int r)为 此次划分的区间为l到r,如何继续划分以及排序的问题代码如下:int a[N],temp[N];void merge_sort(int a[],int l,int r){ if(l>=r) return ; int mid=l+r>>1; // 划分区间,使得l到mid有序,mid+1到r有序 merge_sort(a,l,mid); m原创 2021-12-02 11:11:15 · 531 阅读 · 0 评论 -
快速排序思想以及代码实现
快速排序基于分治算法算法步骤:确定分界点x移动数组内的元素,让<=x的数据放在 x的左边,>=x的数据放在x的右边 (记得要将x放在中间)递归去处理x的左半部分和右半部分思想的C++简单实现:void quick_sort(int a[],int l,int r){ if(l+1>=r) return ; vector<int> left,right,eq; for(int i=l;i<r;i++){ if(a[i]>a[l]){原创 2021-12-01 23:00:19 · 91 阅读 · 0 评论 -
力扣:优先队列合并K个升序链表以及衍生
优先队列合并K个升序链表题目:https://leetcode-cn.com/problems/merge-k-sorted-lists/代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x)原创 2021-11-29 11:44:21 · 188 阅读 · 0 评论 -
力扣268周周赛
力扣268周周赛1.https://leetcode-cn.com/problems/two-furthest-houses-with-different-colors/数据范围这么小,直接暴力:class Solution {public: int ans=-1; int maxDistance(vector<int>& colors) { for(int i=0;i<colors.size();i++){ fo原创 2021-11-21 20:25:20 · 460 阅读 · 0 评论 -
c++中map的特性
c++中map的特性刚刚在力扣做题:https://leetcode-cn.com/problems/longest-harmonious-subsequence/wa代码是这样的:class Solution {public:unordered_map<int,int> mp; int findLHS(vector<int>& nums) { /* 最大最小差别不超过1 既我们可以用哈希表统计出所有取值原创 2021-11-20 00:22:18 · 553 阅读 · 0 评论 -
蓝桥杯中的dp例题
题目:http://lx.lanqiao.cn/problem.page?gpid=T2893思路都在代码里:#include<iostream>#include<cmath>#define N 100001using namespace std;int dp[101][N]; //所有砝码质量始终不会超过100010,故可以用dp[i][j]=1表示前i-1个物品可以测量出质量j,反之则不可以 int w[101];int main(){ int原创 2021-11-18 19:56:08 · 246 阅读 · 0 评论 -
算法比赛的BFS例题和模板
题目:[蓝桥杯2015决赛]穿越雷区http://oj.ecustacm.cn/problem.php?id=1266AC代码,思路都在注释里#include<iostream>#include<vector>#include<queue>using namespace std;int dir[][2]={0,1,0,-1,1,0,-1,0}; //定义了四个方向 struct node{ int x,y; //记录当前位置的坐标 int v;原创 2021-11-18 16:54:17 · 160 阅读 · 1 评论 -
深度优先搜索DFS例题和模板
题目来源:[蓝桥杯2015初赛]牌型种数http://oj.ecustacm.cn/problem.php?id=1253AC代码: 思路都在注释里#include<iostream>using namespace std;int ans=0;void dfs(int k,int n){ //k为当前将要拿哪张牌(注意是将要拿,而不是已经拿了),k取1-13 // n为当前手里有多少张牌,n取1-13 if(k==14&&n==13) {原创 2021-11-18 16:15:46 · 171 阅读 · 0 评论 -
在算法比赛中,如何判断自己会不会超时?
在算法比赛中,如何判断自己会不会超时?先看题目:http://oj.ecustacm.cn/problem.php?id=1026输入的数字最大为N=100000(10的五次方)如果我们采用最简单的冒泡排序o(n²),最终CPU将执行N*N≈10的10次方左右的运算次数,而一般的测评机一秒钟可以执行5X10的8次方左右条指令,因此该算法将运行20S左右,必然超时。因此采用快速排序,复杂度为o(n*log(n)),即可通过。...原创 2021-11-18 15:13:53 · 1106 阅读 · 0 评论 -
算法竞赛中有多组输入应该如何处理
数值统计Description统计给定的n个数中正数的个数Input输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;Output对于每组输入数据,输出一行a,表示给定的数据正数的个数。Sample Input3 1 0 -22 -1 -1Sample Output10#include<iostream>#define N 101int arr[N];using namespace std;原创 2021-11-18 14:50:16 · 439 阅读 · 0 评论 -
力扣 318和位运算集合
学到了位运算的操作:将集合映射到一个数字上,无论是比较还是入集合/出集合都很方便!设s1,s2为集合:将第i个项目入集合s1:s1|=(1<<i) // 无论i之前是否在集合中s1+=(1<<i) // 一定要保证i之前不在集合中,不然会出错将第i个项目出集合s1-=(1<<i) //一定要保证i之前在集合中比较两个集合是否相同s1==s2解决问题的代码:class Solution {public: int maxProduct(v原创 2021-11-17 09:16:12 · 86 阅读 · 0 评论 -
力扣 375
375. 猜数字大小 IIhttps://leetcode-cn.com/problems/guess-number-higher-or-lower-ii/题目的要求是: 求出诸如此类的树的所有子树的最大权值中的最小值class Solution {public:// 200 int dp[201][201]; int get(int i,int j){ //记为从i->j的猜出所有情况的最少消耗 if(i>=j) return 0;原创 2021-11-12 12:47:41 · 245 阅读 · 0 评论 -
山形数组的最大值
山形数组的最大值:y总的模板:(建议背会https://www.acwing.com/blog/content/31/class Solution {public:inline bool check(int i,vector<int> &arr){ return arr[i]>arr[i-1]; } int peakIndexInMountainArray(vector<int>& arr) { //ar原创 2021-10-14 09:17:59 · 261 阅读 · 0 评论 -
校门外的树
CSP 校门外的树设dp[i]为初始位置到第i个障碍物(包含)的方案数,则状态转移方程为dp[i]=sum(dp[k]*cal(k+1,i)) 其中0<=k<i,cal函数用来计算障碍物k+1到i之间的所有等间隔种植树的方案数,用了记忆化搜索,可以稍微减少点时间,但还是只能A50%,对于我这个菜????来说已经够了#include <bits/stdc++.h>#define ll long long#define db double#define pb push_bac原创 2021-09-13 17:47:00 · 98 阅读 · 0 评论 -
2021-08-24
K站中转内最便宜的航班力扣 2021/8/24class Solution {public:#define ll long long#define mm(a,b) memset(a,b,sizeof(a))class GNode{ public: int pos; ll dis; int k; GNode(){ } GNode(int p,ll d,int kk){ pos=p; dis=d; k原创 2021-08-24 10:39:57 · 89 阅读 · 0 评论 -
2021-08-12
2021-8-12力扣每日一题:https://leetcode-cn.com/problems/longest-palindromic-subsequence/class Solution {public://dp[i][j]代表从i到j(不一定包括i j)的最大方案数//状态转移方程: if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1]+2// else dp[i][j]=max(dp[i+1][j],dp[i][j-1])//若s[i]与s[j]相等,那么s[i]原创 2021-08-12 02:04:55 · 167 阅读 · 0 评论 -
2021-07-15
题目:https://www.luogu.com.cn/problem/CF1203D2//============================#include <bits/stdc++.h>#define ll long long#define db double#define pb push_back#define mm(a,b) memset(a,b,sizeof(a))#define de(a) cout<<#a<<"="<<a<原创 2021-07-15 11:41:49 · 94 阅读 · 0 评论 -
2021-05-03
第十二届蓝桥杯B组c++题目以及题解://====================================A:ans=256*1024*1024/4//注:MB的B是大写的B,代表字节(Byte),b代表字节(bit)。B:#define N 2021int arr[10];bool decrese(int x){ while(x!=0) { if(arr[x%10]==0) rt 0; else arr[(x%10)]--; x/=10; } rt 1;原创 2021-05-03 22:40:20 · 107 阅读 · 0 评论 -
2021-04-29
手动实现哈希表::https://vjudge.net/contest/435369#problem/N思路:1.将5个数字分成3,2分组2.则2个元素分组的最大取值范围为-50*50*50*50*2~50*50*50*50*23.开对应大小的数组,在范围内的元素都写入数组即可#define MAXN 6250000*2 ll num[101]={0};short mp[MAXN*2+1]={0};int main(){ for(int i=-50;i<=50;i++) num原创 2021-04-29 18:30:07 · 143 阅读 · 0 评论 -
2021-04-27
滑窗::https://vjudge.net/contest/435369#problem/J思路:经典滑窗问题思考:WA时,留意ans的更新位置,可能会存在漏解,更新位置很重要!//======================================#define N 200005string s[4];int main(){ allint; //deout; lyh(i,1,3) s[i]=""; while(s[1].length()&原创 2021-04-27 19:38:20 · 130 阅读 · 1 评论 -
2021-04-27
思维题::https://vjudge.net/contest/435369#problem/H//==================================/*思路: 1.用一个int-vector映射来保存数组中的数字得到的商的所有情况 2.遍历该map取最小 */int main(){ map<int, vector<int> >mv; int n,m,k,ans; deout; cin>>n>>k; lyh(i原创 2021-04-27 16:39:08 · 89 阅读 · 0 评论 -
2021-04-26
打表::https://vjudge.net/contest/435369#problem/G//=================================思路:0-9的数字的倍数的尾数是固定的,因此可以先打表,把尾数所有的取值都保存下来int sum[10]={0};string s[10];int main(){ for(int i=0;i<10;i++) for(int j=i;;j+=i) { char c=(j%10+'0'); if((s[i].原创 2021-04-26 14:36:02 · 78 阅读 · 0 评论 -
2021-04-26
思维题::E - Love Trianglehttps://vjudge.net/contest/435369#problem/E//============================int arr[5001];int vis[5001];int main(){ int n; cin>>n; lyh(i,1,n) scanf("%d",&arr[i]); lyh(i,1,n) if(i==arr[arr[arr[i]]])原创 2021-04-26 13:51:11 · 66 阅读 · 0 评论 -
2021-04-26
思维题::A - Archmagehttps://vjudge.net/contest/435369#problem/A//=========================int main(){ int t; cin>>t; ll x,y,m,n; while(t--) { scanf("%lld %lld %lld %lld",&n,&m,&x,&y); printf("%lld\n",min(m,(n+(m-1)*y)/x));原创 2021-04-26 13:16:39 · 89 阅读 · 0 评论 -
2021-04-25
图论::弗洛伊德算法https://vjudge.net/contest/433988#problem/E//===================================#include <bits/stdc++.h>#define de(a) cout<<#a<<"="<<a<<endl;#define lyh(i,a,b) for(int i=a;i<=b;i++)#define hyl(i,a,b) for(int原创 2021-04-25 11:48:27 · 89 阅读 · 0 评论 -
2021-04-23
关于 ios::sync_with_stdio(0);使用该函数时,会提升cin cout的速度,但是相当于禁用了缓冲区,在某些代码并不适用,如:for(int i=0;i<n;i++) { ll t; cin>>t; it=s.lower_bound(t); if(it!=s.end()&&*it==t) continue; s.insert(t); q.push(t); if(s.size()>k) { s原创 2021-04-23 22:18:09 · 62 阅读 · 0 评论 -
2021-04-22
活用数据结构:https://vjudge.net/contest/433988#problem/J#include <bits/stdc++.h>#define debug(a) cout<<#a<<"="<<a<<endl;#define lyh(i,a,b) for(int i=a;i<=b;i++)#define hyl(i,a,b) for(int i=a;i>=b;i--)#define ll long long原创 2021-04-22 21:07:31 · 70 阅读 · 0 评论 -
2021-04-07
第十届蓝桥杯决赛1.2.动态规划ll ans=0;bool prime[2020]={0};vector<int> isprime;int main(){ lyh(i,2,2019) prime[i]=1; lyh(i,2,2019) { if(prime[i]) { isprime.push_back(i); for(int j=i+i;j<=2019;j+=i) prime[j]=0; } } //打表 ll dp[202原创 2021-04-17 21:54:40 · 75 阅读 · 0 评论 -
2021-04-14
2021/4/14力扣: 208class Trie {public:class node{ public:string val;int type; //0代表查前缀,1代表查全体node(string v,int t){ val=v; type=t;} bool operator <(const node &a) const{ if(type==1) return val<a.val; else return原创 2021-04-14 15:45:23 · 65 阅读 · 0 评论 -
2021-04-11
2021/4/11https://codeforces.ml/contest/1512//=============================字符串处理问题,细节特别多特别麻烦#include <bits/stdc++.h>using namespace std;int main(){ int t, n, k, a, b, l; cin>>t; while(t-- and cin>>a>>b){ string str; cin>原创 2021-04-11 12:00:11 · 63 阅读 · 0 评论 -
2021-04-10
2021/4/10蓝桥杯:: 第十届决赛H解谜游戏https://www.lanqiao.cn/courses/2786/learning/?id=70881//===================================思路:在旋转的过程中观察到,只有某些特定的木棍集合内才可以进行互换,利用并查集求得:把所有层的木棍拼接起来,每隔四个的木棍就是一个集合的,总共四个集合,因此只需检查这四个集合的木棍种类和数量是否满足R=2,Y=1,G=3即可#include <bits/stdc+原创 2021-04-10 22:33:04 · 64 阅读 · 0 评论 -
2021-04-07
[蓝桥杯2019初赛]后缀表达式http://oj.ecustacm.cn/problem.php?id=1467//=========思路:主要还是贪心,多举几个例子再自己算算就明白了假设只有一个减号,数字为a,b,c,d,e…计算过程可以写为:a-(b+c+d+e+…)=a-b-c-d-e-…等价于有n+m个减号(数字的个数-1个减号),也就是说,减号不在于有多少,而在于有没有,因此,分类讨论有和没有的情况:1.没有:全部是+,那就把所有数字加起来就是答案2.有: 再将数字分为是否全原创 2021-04-07 15:23:24 · 79 阅读 · 0 评论 -
2021-04-06
2021/4/26蓝桥杯:: [蓝桥杯2019初赛]等差数列http://oj.ecustacm.cn/problem.php?id=1466//=================================总结:一定要考虑公差为0的情况,不然结果就是90%#include <bits/stdc++.h>#define debug(a) cout<<#a<<"="<<a<<endl;#define lyh(i,a,b) for(i原创 2021-04-06 17:05:06 · 80 阅读 · 0 评论