c++算法
文章平均质量分 91
_qz
这个作者很懒,什么都没留下…
展开
-
即约分数(最大公约数)
问题描述如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。例如,34 , 52 , 18 , 71 都是既约分数。请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?答案提交这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案2481215代码#include<bits/stdc++.h>using namespace std;long l原创 2020-11-12 16:32:02 · 2475 阅读 · 0 评论 -
解谜游戏——第十届蓝桥杯b组c++决赛题目H
题目描述小明正在玩一款解谜游戏,谜题由 24 根塑料棒组成,其中黄色塑料棒 4 根,红色 8 根,绿色 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排成三圈,如上图所示,外圈 12 根,中圈 8 根,内圈 4 根。小明可以进行三种操作:将三圈塑料棒都顺时针旋转一个单位。例如当前外圈从 0 点位置开始,顺时针依次是 YRYGRYGRGGGG,中圈是 RGRGGRRY,内圈是 GGGR。那么顺时针旋转一次之后,外圈、中圈、内圈依次变为:GYRYGRYGRGG原创 2020-11-12 00:32:21 · 6406 阅读 · 12 评论 -
素数求和
问题描述输入一个自然数n,求小于等于n的素数之和样例输入2样例输出2数据规模和约定测试样例保证 2 <= n <= 2,000,000思路首先将 2-n 的数全部标记为素数由小到大遍历每一个标记为素数的数字,将该素数的倍数全部置为标记为非素数最后求和详细见代码代码#include<bits/stdc++.h>using namespace std;const int maxn = 2e7 + 50;int flag[maxn],n;long lon原创 2020-11-11 14:44:06 · 1655 阅读 · 0 评论 -
c_str()
语法:const char c_str();c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同.这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针比如:最好不要这样:char c;string s=“1234”;c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其转载 2020-11-10 12:55:34 · 146 阅读 · 0 评论 -
第九届蓝桥杯国赛 调手表(BFS)
题目描述小明买了块高端大气上档次的电子手表,他正准备调时间呢。在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟。大家都知道,手表只有一个按钮可以把当前的数加一。在调分钟的时候,如果当前显示的数是 0 ,那么按一下按钮就会变成 1,再按一次变成 2 。如果当前的数是 n - 1,按一次后会变成 0 。作为强迫症患者,小明一定要把手表的时间调对。如果手表上的时间比当前时间多1,则要按 n - 1 次加一按钮才能调回正确时间。小明想,如果手表可以再添加一个按钮,表示把原创 2020-11-09 21:32:23 · 225 阅读 · 0 评论 -
优先队列 + BFS
题目描述乍一看是BFS最短路径,但仔细思考下,发现最短路径不一定是时间最短的,所以需要求最短时间,用优先队列去存储状态。#include<bits/stdc++.h>using namespace std;int n,m,t,vis[105][105];char arr[105][105];int sx,sy,ex,ey,ans ;struct node{ int x,y,num; friend bool operator < (node x,node y){原创 2020-11-08 18:20:25 · 186 阅读 · 1 评论 -
1210.连号区间数
题目描述解析:链接因为是从1~N的排列,可以枚举两端的位置,找出选取序列的最大值和最小值,如果最大值和最小值的差等于两端位置之差则ans++,三层循环的话会超时#include<bits/stdc++.h>using namespace std;int n,a[10005],ans = 0,maxn,minn,j;int main(){ //freopen("a.txt","r",stdin); scanf("%d",&n); for(int i = 0;i<原创 2020-10-15 22:09:05 · 116 阅读 · 0 评论 -
力扣496 下一个更大元素(单调栈+map)
题目描述题目链接: 原题目分析我们可以忽略数组 nums1,先对将 nums2 中的每一个元素,求出其下一个更大的元素。随后对于将这些答案放入哈希映射(HashMap)中,再遍历数组 nums1,并直接找出答案。对于 nums2,我们可以使用单调栈来解决这个问题。我们首先把第一个元素 nums2[1] 放入栈,随后对于第二个元素 nums2[2],如果 nums2[2] > nums2[1],那么我们就找到了 nums2[1] 的下一个更大元素 nums2[2],此时就可以把 nums2[1原创 2020-09-11 20:02:02 · 127 阅读 · 0 评论 -
P2032 扫描 (单调队列)
题目描述单调队列讲解:链接在队列中,将插入元素的一端称为队尾,另一端成为队首。单调队列可以在队尾加元素,可以在队首出元素,并且保证队内元素单调,常用于取区间最优。代码#include<bits/stdc++.h>using namespace std;const int maxn = 2e6+50;int n,m,a[maxn],d[maxn]; //a存储数据,d存储下标来模拟队列int h = 1,t = 0; // h为队头,t为队尾int main(){原创 2020-09-10 21:40:45 · 280 阅读 · 0 评论 -
P3406 海底高铁(差分)
题目描述分析差分求出每段路程的经过次数,在根据a,b,c求出哪种方案便宜for(int i = 1;i<m;i++){ int x= min(a[i],a[i+1]),y = max(a[i],a[i+1]); b[ x ] += 1; b[ y ] -= 1; } ps. 因为是对路程差分,所以是b[y]-- ,不是b[y+1]–。代码#include<iostream>#include<stdlib.h>#include<原创 2020-09-04 19:16:37 · 260 阅读 · 0 评论 -
P3397 地毯(二维差分)
题目描述分析dalao的分析:链接代码#include<iostream>#include<stdlib.h>#include<string>//#include<math.h>#include<algorithm>#include<vector>#include<cstdio>using namespace std;int n,m,x1,x2,y1,y2,sum;int a[1005][100原创 2020-09-04 19:09:59 · 214 阅读 · 0 评论 -
P1469 找筷子(数论)
题目描述分析题目限制空间为4MB,开一个1e7的数组就差不多了用异或。我们考虑异或的两个小小的性质:kk 个相同的数的异或和,当 kk 为奇数时,结果是这个数本身,否则结果是 0。任何数与 0 的异或值是它本身。然后注意到题目。题目需要求 nn 个数中出现奇数次的那个数,且保证这个数存在且只有一个。于是我们根据上面两个性质得出,答案就是这 nn 个数的异或和。代码#include<iostream>#include<stdio.h>#include<原创 2020-09-03 14:32:05 · 353 阅读 · 0 评论 -
P2814 家谱(map + 并查集)
题目描述代码#include<bits/stdc++.h>using namespace std;const int maxn = 1e5+50;int n,m;char ch;string fname,sname,s;map<string,string>mp; //mp[儿子,父亲]; string find(string s){ //寻找祖先 if(s == mp[s]) return s; else{ string F = find(mp[s])原创 2020-09-02 20:24:53 · 273 阅读 · 0 评论 -
P1918 保龄球(排序+二分)
题目描述原创 2020-09-02 20:14:00 · 344 阅读 · 0 评论 -
P5205 木材仓库
题目描述要点除vector 和string 之外的STL容器都不支持 ** (it + 1)* 的访问方式。当容器使用 lower_bound或者 upper_bound 时,要将容器名称写到前面,例:it = st.lower_bound(t2);代码#include<bits/stdc++.h>using namespace std;const int maxn = 1005;set<int>st;int t,t1,t2,ans;int main(){原创 2020-09-02 15:44:56 · 214 阅读 · 1 评论 -
P2678 跳石头(贪心+二分答案)
题目描述分析遇到最短距离的最大值,用二分通过遍历最短跳跃距离来用贪心策略计算需要挪走的岩石,来与M值比较。直接遍历超时,用二分法。首先,二分的范围:最短为岩石之间或者岩石与岸边的最小距离;最大为整个比赛的长度。由题意得,最短跳跃距离越大,需要挪走的岩石越多,正相关,递增序列。要找最短距离的最大值,就要找到第一个大于M值(要挪走的岩石数)减1,即为最短距离的最大值,要特判岩石数为0时,最短跳跃距离为整个路程(第三个点)。代码#include<bits/stdc++.h> t原创 2020-08-29 11:40:13 · 224 阅读 · 1 评论 -
P1443 马的遍历 (BFS)
题目描述代码#include<bits/stdc++.h> typedef long long ll;using namespace std;const int maxn = 500;int n,m,sx,sy,vis[maxn][maxn],ans[maxn][maxn];int fx[16]={2,-2,2,-2,-1,1,-1,1},fy[16]={1,1,-1,-1,2,2,-2,-2};//方向void bfs(){ queue<pair<int,int原创 2020-08-29 10:30:35 · 195 阅读 · 0 评论 -
P1182 数列分段(贪心+二分答案)
题目描述分析这题用二分法首先,二分法需要有一个单调的序列,肯定不能对数列排序,数列不能变;换一个方向:遍历每段和的最大值,通过最大值用贪心思想去确定段的个数,得到一个限制区间,在区间中求最小值;首先,每段和的最大值的范围:当一个元素一段时,就是元素中的最大值;所有元素在一段中时,就是所有元素的和。并且通过观察,段的个数随着每段和的最大值单调递减(可能会相等)如果直接遍历会超时,所以采用二分法。因为是递减序列,所以条件跟递增相反,要求满足条件的第一个小于等于M值的数(或者直接二分搜索等于M的原创 2020-08-28 23:01:50 · 402 阅读 · 0 评论 -
P1102 数对
题目描述思路对每一个元素遍历,用upper_bound() - lower_bound() 求出所求元素的数对的个数,之后相加。代码#include<bits/stdc++.h> using namespace std;int n,c,a[200005];long long ans = 0;int main(){ //freopen("a.txt","r",stdin); cin>>n>>c; for(int i = 1;i<=n;i++){原创 2020-08-28 12:23:16 · 129 阅读 · 0 评论 -
P1164 小A点菜(搜索)
题目描述代码#include<bits/stdc++.h>using namespace std;int n,m,a[105],ans = 0;void dfs(int n,int m){ if(m == 0){ ans++; return ; } if(n < 0 || m < 0) return ; //如果倒数第n样菜拿的话 dfs(n-1,m-a[n]); //如果倒数第n样菜不拿的话 dfs(n-1,m); }int main()原创 2020-08-26 10:18:28 · 138 阅读 · 0 评论 -
P1028 数的计算(记忆化搜索)
题目描述代码#include<bits/stdc++.h>using namespace std;int n;int f[2000]; //记忆化搜索 int dfs(int k){ //边界当加的数为1时,返回1; if(k == 1) return 1 ; //当数组中有值时,直接加上; if(f[k]) return f[k]; int re = 0; for(int i = 1;i<=k/2;i++){ //分别递归加上从1到k/2的个数。原创 2020-08-25 16:44:44 · 175 阅读 · 0 评论 -
栈(记忆化搜索)
题目背景讲解当操作数队列为空时,会得到一种输出序列,将其作为递归的边界;当操作数队列不为空时,有两种情况:当栈内数大于0时,弹出一位;操作数序列进栈内一位。所以,递归的参数有两个,一个为操作数序列当前的个数,另一个为栈内的个数。代码#include<bits/stdc++.h>using namespace std;long long a[100][100];long long dfs(int x,int y){ //x表示栈内,y表示队列中 if(a[x][原创 2020-08-25 14:52:34 · 146 阅读 · 0 评论 -
数楼梯
题目讲解大佬讲解:链接根据题意得这一层楼梯的方案数等于前一层的方案数加上前两层的方案数,即dp[k] = dp[k-1] + dp[k-2]采用二维数组,方便高精加,将之前一维的数字看作整形数组铺开,就成了二维数组。代码#include<bits/stdc++.h>using namespace std;const int maxn = 5005;long long n,dp[maxn][maxn];int len = 1;int jj(int k){ //高精加 /原创 2020-08-24 11:00:45 · 191 阅读 · 0 评论 -
高精加(模板)
题目代码#include<iostream>#include<string.h>using namespace std;const int maxn = 500;char a[maxn],b[maxn];int aa[maxn],bb[maxn],cc[maxn];int main(){ cin>>a>>b; //逆序赋值给整形数组 int la = strlen(a),lb = strlen(b); for(int i = 0;i原创 2020-08-24 10:52:17 · 749 阅读 · 0 评论 -
拼木棒
题目数据规模讲解大佬讲解:链接代码:#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 50005;const ll mod = 1e9+7;int n,a[maxn] = {0},t,allmax =0;ll ans = 0;//从K个里面挑选两个 int C(int k){ return k*(k-1)/2%mod;}int main(){ c原创 2020-08-23 23:27:18 · 300 阅读 · 0 评论 -
选数
题目代码主要代码:void dfs(int t,int sum,int start){ //t为选择的个数,sum为总和,start为当前开始选择的下标 if(t == k && check(sum)){ ans++; return ; } //下次递归选择的数都从 当前数的下一个开始, //不会往前选,就不会重复情况 for(int i = start;i<n;i++){ dfs(t+1,sum + a[i],i + 1); }}规定了每次原创 2020-08-23 00:25:02 · 200 阅读 · 0 评论 -
高精乘
题目详解具体可见大佬博客 : 链接首先用字符数组读入,再将数字逆序转换到整形数组中。进行不进位的相乘 。进行进位除去前导的0 (例如 0X100,结果为000)倒序输出代码#include<bits/stdc++.h>using namespace std;const int maxn =2000;char a[maxn],b[maxn];int aa[maxn],bb[maxn],c[maxn];void slove(char a[],char b[]){原创 2020-08-22 19:40:52 · 134 阅读 · 0 评论 -
快速幂
例题:给定三个整数,a,b,c(a <10^ 9 、b < 10^ 18 ,1<m<10^ 9),求 (a^b)%m基本思想:快速幂基于二分的思想,也称为二分幂。快速幂基于以下事实:- 如果b 是奇数,则有a^b = a*a^(b-1)- 如果b 是偶数, 则有a^b = a^(b/2) * a^(b/2)显然,b是奇数的情况下总可以在下一步转化为b为偶数的情况,而b是偶数的情况总是可以在下一步转换为 b/2 的情况。这样,在log(b) 级别次数的转换后,就可以把b原创 2020-05-18 23:07:26 · 93 阅读 · 0 评论 -
二分模板
转载:模板转载 2020-05-16 23:34:34 · 124 阅读 · 0 评论 -
拓扑排序
PS:B站上的讲解思路:定义一个队列Q,并把所有入度为0的节点加入队列取队首节点,输出。然后删去所有从它出发的边,并令这些边到达的顶点的入度减一,如果某个顶点的入度减为0,则将其加入队列。反复进行2操作,直到队列为空,如果过队的节点数目为N,则图为有向无环图;否则图中存在环vector<int>e[maxv]; //存储边的邻接表int n,m,inDegree[maxv]; //顶点数,边数,存储顶点入度的数组bool topologicalSort(){ int num原创 2020-05-13 00:38:05 · 86 阅读 · 0 评论 -
P1145 -- 约瑟夫
题目描述:n 个人站成一圈,从某个人开始数数,每次数到 mm 的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,k个好人站在一起,k 个坏人站在一起。从第一个好人开始数数。你要确定一个最小的 m,使得在第一个好人被杀死前,k 个坏人先被杀死。输入格式:一行一个整数 k输出格式:一行一个整数 mm0<k<14代码:#include<iostream>using namespace std;int main(){ int k; c原创 2020-05-12 21:43:05 · 1171 阅读 · 0 评论 -
最小生成树---Kruskal算法(模板)
ps:B站上的讲解Kruskal算法的基本思想为:初始时隐去所有的边,这样图中每个顶点都自成一个连通块。之后执行下面的步骤:对所有的边按照从小到大排序。按照边权从小到大测试所有的边,如果当前测试的边所连接的两个顶点不在一个连通块中,则把这条测试边加入当前最小生成树中;否则,将边舍去。执行步骤2,直到最小生成树的边数小于总顶点的数目减一或是测试完所有边结束。当结束时最小生成树的边数小于总顶点数减一,则该图不连通。模板:struct node{ int u,v,dis;}e[M];bool原创 2020-05-11 22:06:21 · 666 阅读 · 0 评论 -
并查集(模板)
有一个叫做“数码世界”奇异空间,在数码世界里生活着许许多多的数码宝贝,其中有些数码宝贝之间可能是好朋友,并且数码宝贝世界有两条不成文的规定: 第一,数码宝贝A和数码宝贝B是好朋友等价于数码宝贝B与数码宝贝A是好朋友 第二,如果数码宝贝A和数码宝贝C是好朋友,而数码宝贝B和数码宝贝C也是好朋友,那么A和B也是好朋友,现在给出这些数码宝贝中所有好朋友的信息,问:可以把这些数码宝贝分成多少组,满足每组中的任意两个数码宝贝都是好朋友,而且任意两组之间的数码宝贝都不是好朋友—————原创 2020-05-11 15:24:27 · 153 阅读 · 0 评论 -
最小生成树 ----Prim算法(模板)
输入:6 100 1 40 4 10 5 21 2 61 5 32 3 62 5 53 4 43 5 54 5 3第一行为顶点数和边数接下来的m行为两个节点以及节点到节点的边权输出: 15代码:#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;int n,m,vis[100],re = 0,d[100];//vis为访问标记数组,re为最小生成树的边权之和,d为节点原创 2020-05-10 22:42:58 · 347 阅读 · 0 评论 -
Dijkstra算法(二) --最短路径数目,最短路径(模板)
描述:给出n 个城市,M条无向边。每个城市中都有一定数目的救援小组,所有边的边权已知。现在给出起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条最短路径,则输出数目之和最大的。样例:输入:第一行4个数,为n,m,起点,终点第二行为 每个顶点的救援小组数目之后的m行为顶点到顶点之间的边权5 6 0 21 2 1 5 30 1 10 2 20 3 11 2 12 4 13 4 1输入:两个数,为最短路径条数以及最短路径上救援小组数目之和。2 4原创 2020-05-08 20:22:02 · 1613 阅读 · 0 评论 -
Dijkstra算法(一) ---最短路径(模板)
描述:第一行两个整数n和m ,表示顶点个数(编号为1~n),m表示边的条数。接下来m行,每行有3个数x,y,z,表述从顶点x到顶点y边的权值为z。样例输入:6 91 2 11 3 122 3 92 4 33 5 54 3 44 5 134 6 155 6 4输出:0 1 8 4 13 17代码:#include<bits/stdc++.h>using...原创 2020-05-04 22:09:48 · 274 阅读 · 0 评论 -
P1029 最大公约数和最小公倍数问题
题目描述输入两个正整数 x_0, y_0x ,求出满足下列条件的 P, Q的个数:P,Q 是正整数。要求 P, Q 以 x_0为最大公约数,以 y_0 为最小公倍数。试求:满足条件的所有可能的 P, Q 的个数。输入格式一行两个正整数 x_0, y_0;输出格式一行一个数,表示求出满足条件的 P, Q 的个数。样例输入:3 60输出:4代码#include<b...原创 2020-05-01 18:30:57 · 2261 阅读 · 0 评论 -
1095.山脉数组中查找目标值------二分搜索
描述:(这是一个 交互式问题 )给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。如果不存在这样的下标 index,就请返回 -1。何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:首先,A.length >= 3其次,在 0 < i < A.l...原创 2020-04-29 13:46:05 · 138 阅读 · 0 评论 -
每日一题----33. 搜索旋转排序数组
描述:假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为[4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例:输入: nums = [4,5,6,7,0,1,2], targe...原创 2020-04-27 18:11:46 · 159 阅读 · 0 评论 -
每日一题----全排列(46)
题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列:示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]代码:class Solution {public: vector<vector<int>> permute(vector<i...原创 2020-04-25 16:18:02 · 132 阅读 · 0 评论