![](https://img-blog.csdnimg.cn/20201105142900820.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法题笔记
文章平均质量分 51
存一些算法题代码
sweetheart7-7
技术源于热爱 ---------------------- 学习改变命运,知识改变未来 ---------------------- Architect-Road
展开
-
C++从控制台读取一行字符串
#include<iostream>using namespace std;int main(){ string s; getline(cin, s); cout << s << endl; return 0;}原创 2022-02-08 19:34:44 · 1365 阅读 · 0 评论 -
【PAT】A1086 Tree Traversals Again - C++
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(原创 2022-02-14 10:37:05 · 195 阅读 · 0 评论 -
L2-007 家庭房产 (25 分) - C++
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。输入格式:输入第一行给出一个正整数 N(≤1000)N(≤1000)N(≤1000),随后 NNN 行,每行按下列格式给出一个人的房产:编号 父 母 k 孩子1 … 孩子k 房产套数 总面积其中编号是每个人独有的一个 4 位数的编号;父和母分别是该编号对应的这个人的父母的编号(如果已经过世,则显示 -1);k(0≤k≤5)k(0≤k≤5)k(0≤k≤5)是该人的子女的个数;孩子 i 是其子女的编号。输出原创 2022-01-28 18:37:14 · 955 阅读 · 0 评论 -
对二进制的每一位分别取反(某一位)
string a;cin >> a; // 1010int x = 0;// 先转成10进制数字for(int i = 0; i < a.size(); i++){ x += ((a[i]-'0') << (a.size()-i-1));}int revnum;// 对每一位取反for(int i = 0; i < a.size(); i++){ revnum = x ^ (1 << i); cout &原创 2022-01-19 19:04:47 · 1748 阅读 · 0 评论 -
三分法(整数/浮点数 三分法)
说明:三分法可以用来查找凸函数的最大(小)值。如果 lmid 和 rmid 在最大(小)值的同一侧:由于单调性,一定是二者中较大(小)的那个离最值近一些,较远的那个点对应的区间不可能包含最值,所以可以舍弃。如果在两侧:由于最值在二者中间,我们舍弃两侧的一个区间后,也不会影响最值,所以可以舍弃。画图就可以看出来画图就可以看出来画图就可以看出来整数三分模板int l = 1,r = 100;while(l < r) { int lmid = l + (r - l) / 3; //原创 2021-08-29 23:25:23 · 2291 阅读 · 0 评论 -
【树上倍增】最近公共祖先(LCA)
模版题:https://www.luogu.com.cn/problem/P3379视频讲解1视频讲解2某佬题解思路:设当前节点为 xxx,fa[x][i]fa[x][i]fa[x][i] 代表 xxx 的第 2i2^i2i 个祖先节点,显然 fa[x][0]fa[x][0]fa[x][0] 代表 xxx 的直接父节点,而 fa[x][i]fa[x][i]fa[x][i] = fa[fa[x][i−1]][i−1]fa[fa[x][i-1]][i-1]fa[fa[x][i−1]][i−1]原创 2021-08-25 20:05:56 · 196 阅读 · 2 评论 -
扩展欧几里得求同余方程组
题目给定x三 mi (mod ai),求一个最小的非负整数 x即x 三 m1 (mod a1)x三 m2 (mod a2)…x三 mk (mod ak)对于线性同余方程组,可以用中国剩余定理来解,但是要求m1,m2,…,mk两两互质所以此题不能用中国剩余定理!先解第1、2个式子a1 * k1 + m1 = xa2 * k2 + m2 = x联立得:a1 * k1 - a2 * k2 = m2 - m1 (1)可以利用exgcd解方程 a1 * k1 - a2 * k2 = gc原创 2021-08-11 15:34:10 · 381 阅读 · 0 评论 -
线段树、树状数组、ST表
#include <iostream>using namespace std;const int n = 6;int arr[] = {1, 3, 5, 7, 9, 11};int tree[n * 4 + 1];/** * * @param node tree中的下标 * @param start arr中的下标 表示区间 [start, end] * @param end */void buildTree(int node, int start...原创 2021-07-23 12:01:35 · 334 阅读 · 1 评论 -
贪心/动归问题
快速渡河问题https://vjudge.net/problem/POJ-1700此问题可能有两种解,求这两个解的min即可第一种是前两个出发,1返回,最后两名出发,2返回第二种是1和最后一个出发,1返回,1又和当前最后一个出发,1返回。。。。(即每次由1带领)#include <cstdio>#include <algorithm>using namespace std;int a[1005];void fn(int n){ int left = n原创 2021-07-21 17:38:24 · 178 阅读 · 1 评论 -
单调栈与单调队列
单调栈板子题https://www.luogu.com.cn/problem/P5788#include <iostream>#include <stack>using namespace std;typedef long long ll;int a[3000100], f[3000100];stack<ll> st;int main(){ ll n; scanf("%lld", &n); for (int .原创 2021-07-21 12:49:41 · 153 阅读 · 0 评论 -
递推/递归问题
#include <cstdio>/* * 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合构成一个给定的数值n。 * 例如n=200,那么一种可能的组合方式为:200 = 3*1 + 1*2 + 1*5 + 2*20 + 1*50 + 1*100. * 问总共有多少种可能的组合方式? */int coins[4] = {1,5,10,15};// n是当前剩余金币数,cur是能取的最大额度的indexint fn(int n,in原创 2021-07-16 11:22:18 · 177 阅读 · 0 评论 -
——数论相关
扩展欧几里得#include <cstdio>typedef long long ll;ll x, y;// 扩展欧几里得// x,y 是ax + by = gcd(a, b)的解ll ext_gcd(ll a, ll b){ if(b == 0){ x = 1; y = 0; return a; } ll res = ext_gcd(b, a % b); ll x1 ...原创 2021-07-14 15:51:07 · 216 阅读 · 0 评论 -
Nim问题
将每堆的数表示为二进制形式,然后将所有数异或起来,如果先手时,异或的结果为非0,则必赢(调整某个二进制的某几位,使其变为0),为0时必输。#include <cstdio>int a[] = {5, 10, 15};// nim游戏bool solve(){ int res = 0; int n = sizeof(a) / sizeof(a[0]); for (int i = 0; i < n; ++i) { res ^= a[i]; .原创 2021-07-13 15:54:15 · 409 阅读 · 0 评论 -
三进制解决天平称重
#include <cstdio>#include <vector>#include <cmath>using namespace std;vector<char> s;vector<int> list;int n;void toThree(int n){ int m; while (n>0){ m = n % 3; n /= 3; s.push_back(m原创 2021-07-13 12:05:59 · 269 阅读 · 0 评论 -
next数组的应用
https://vjudge.net/problem/HDU-1358#include <cstdio>using namespace std;void nextArr(char * s1, int n, int next[]){ next[0] = -1; next[1] = 0; int j = 1; int k = next[j]; while (j < n){ if(k == -1 || s1[k]== s1[j原创 2021-07-12 18:01:54 · 207 阅读 · 0 评论 -
尺取法(字符串)
#include <cstdio>#include <cstring>const int inf = (1 << 30) - 1;// 尺取法// 求字符串的子串中恰好含有2个h,1个i,1个o的最短子串长度bool check(char w[], int i, int j){ int c1 = 0,c2 = 0,c3 = 0; for (int k = i; k <= j; ++k) { if(w[k] == 'h')原创 2021-07-12 17:11:40 · 189 阅读 · 0 评论 -
字符匹配之KMP
#include <cstdio>#include <string>using namespace std;void nextArr(int next[], string s){ int n = s.size(); if(n == 0){ return; } // 初始化数组[0,1]位置的值 next[0] = -1; if(n == 1){ return; } next[原创 2021-07-11 16:04:17 · 100 阅读 · 0 评论 -
子数组与子矩阵的最大累加和
#include <iostream>#include <cstdio>using namespace std;// 最大子数组int findDp(int a[], int n){ if(n==0){ return 0; } int max = a[0], sum = 0, ind = -1; for (int i = 0; i < n; ++i) { if(sum > 0){原创 2021-07-10 17:10:46 · 99 阅读 · 0 评论 -
字符串匹配之RabinKarp
#include <cstdio>#include <cmath>using namespace std;typedef unsigned long long ull;const int dd = 31;ull hashValue(char chs[], int i, int j){ ull sum = 0; for (int k = i; k <= j; ++k) { sum = (sum) * dd + chs[k];原创 2021-07-11 10:18:49 · 150 阅读 · 0 评论 -
L2-016 愿天下有情人都是失散多年的兄妹 (25 分) - JAVA
呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?输入格式:输入第一行给出一个正整数N(2 ≤ N ≤104 ),随后N行,每行按以下格式给出一个人的信息:本人ID 性别 父亲ID 母亲ID其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。接下来给出一个正整数K,随后K行,每行给出一对有情原创 2021-04-23 09:34:15 · 796 阅读 · 6 评论 -
L2-015 互评成绩 (25 分)-JAVA
学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。输入格式:输入第一行给出3个正整数N(3 < N ≤ 104,学生总数)、k(3 ≤ k ≤ 10,每份作业的评审数)、M(≤ 20,需要输出的学生数)。随后N行,每行给出一份作业得到的k个评审成绩(在区间[0, 100]内),其间以空格分隔。输出格式:按非递减顺序输出最后得分最高的M个成绩,保留原创 2021-04-22 22:17:37 · 552 阅读 · 1 评论 -
L2-014 列车调度 (25 分) - JAVA
火车站的列车调度铁轨的结构如下图所示。两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?输入格式:输入第一行给出一个整数N (2 ≤ N ≤105),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。输出格式:在一行中输出原创 2021-04-22 21:58:30 · 540 阅读 · 2 评论 -
L2-013 红色警报 (25 分)-JAVA
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。输入格式:输入在第一行给出两个整数N(0 < N ≤ 500)和M(≤ 5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数。随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的信息,即一原创 2021-04-22 21:42:41 · 467 阅读 · 0 评论 -
L2-012 关于堆的判断 (25 分) - JAVA
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:x is the root:x是根结点;x and y are siblings:x和y是兄弟结点;x is the parent of y:x是y的父结点;x is a child of y:x是y的一个子结点。输入格式:每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初原创 2021-04-21 21:39:16 · 335 阅读 · 0 评论 -
L2-011 玩转二叉树 (25 分) - JAVA
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:71 2 3 4 5 6 74 1 3 2 6 5 7输出样例:4 6 1原创 2021-04-21 21:07:31 · 313 阅读 · 0 评论 -
L2-010 排座位 (25 分) - JAVA
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位。无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席。输入格式:输入第一行给出3个正整数:N(≤100),即前来参宴的宾客总人数,则这些人从1到N编号;M为已知两两宾客之间的关系数;K为查询的条数。随后M行,每行给出一对宾客之间的关系,格式为:宾客1 宾客2 关系,其中关系为1表示是朋友,-1表示是死对头。注意两个人不可能既是朋友又是敌人。最后K行,每行给出一对需要查询的宾原创 2021-04-21 20:43:05 · 285 阅读 · 2 评论 -
L2-008 最长对称子串 (25 分) - JAVA
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。输入格式:输入在一行中给出长度不超过1000的非空字符串。输出格式:在一行中输出最长对称子串的长度。输入样例:Is PAT&TAP symmetric?输出样例:11import java.util.Scanner;public class Main { public static vo原创 2021-04-20 20:51:10 · 536 阅读 · 0 评论 -
L2-006 树的遍历 (25 分) - JAVA
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。输入样例:72 3 1 5 7 6 41 2 3 4 5 6 7输出样例:4 1 6 3 5 7 2import java.util.ArrayList;im原创 2021-04-20 09:45:19 · 294 阅读 · 0 评论 -
L3-003 社交集群 (30 分)-JAVA
当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。输入格式:输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:Ki: hi[1] hi[2] … hi[Ki]其中Ki (>0)是兴趣爱好的个数,hi[j]是第j个兴趣爱好的编号,为区间 [1, 100原创 2021-04-19 21:29:17 · 284 阅读 · 0 评论 -
L2-004 这是二叉搜索树吗? (25 分) - JAVA
一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,其左子树中所有结点的键值小于该结点的键值;其右子树中所有结点的键值大于等于该结点的键值;其左右子树都是二叉搜索树。所谓二叉搜索树的“镜像”,即将所有结点的左右子树对换位置后所得到的树。给定一个整数键值序列,现请你编写程序,判断这是否是对一棵二叉搜索树或其镜像进行前序遍历的结果。输入格式:输入的第一行给出正整数 N(≤1000)。随后一行给出 N 个整数键值,其间以空格分隔。输出格式:如果输入序列是对一棵二叉搜索树或其镜像原创 2021-04-19 17:42:05 · 451 阅读 · 0 评论 -
紧急救援 (25 分) - JAVA
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,原创 2021-04-16 00:28:40 · 420 阅读 · 0 评论 -
JAVA蓝桥杯真题笔记(2017年B组)
文章目录1.标题: 购物单2.标题:纸牌三角形3.标题:承压计算4.标题:魔方状态5.标题:取数位6.标题:最大公共子串7.标题:日期问题8.标题:包子凑数9.标题: 分巧克力10.标题: k倍区间1.标题: 购物单小明刚刚找到工作,老板人很好,只是老板夫人很爱购物。老板忙的时候经常让小明帮忙到商场代为购物。小明很厌烦,但又不好推辞。这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的。小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定。现在小明很心烦,请你帮他计算一下,需要从原创 2021-04-15 21:14:44 · 210 阅读 · 0 评论 -
dijkstra基础模板-JAVA
package 数据结构;import java.util.Scanner;public class _dijkstra基础模板 { static int[] dis = new int[505]; // 距离 static int[] vis = new int[505]; // 标记是否已经访问 static int[][] tab = new int[505][505]; // 邻接矩阵 static int[] pre = new int[505];.原创 2021-04-14 23:48:58 · 253 阅读 · 1 评论 -
JAVA蓝桥杯真题笔记(2017年A组)
文章目录1.标题:迷宫2.标题:9数算式3.标题:魔方状态4.标题:方格分割1.标题:迷宫X星球的一处迷宫游乐场建在某个小山坡上。它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R表示走到右边的房间,U表示走到上坡方向的房间,D表示走到下坡方向的房间。X星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!开始的时候,直升机把100名玩家放入一个个小房间内。玩家一定要按照地原创 2021-04-14 20:31:18 · 268 阅读 · 0 评论 -
六度空间(30 分)-JAVA
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。 图1 六度空间示意图“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于历史的原因,这样的研究具有太大的局限性和困难。随着当代人的联络主要依赖于电话、短信、微原创 2021-04-12 22:28:24 · 215 阅读 · 0 评论 -
图着色问题 (25 分)-JAVA
图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。输入格式:输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N(≤20),是待检原创 2021-04-12 13:36:21 · 895 阅读 · 1 评论 -
部落 (25 分)-JAVA
在一个社区里,每个人都有自己的小圈子,还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里,于是要请你统计一下,在一个给定社区中,到底有多少个互不相交的部落?并且检查任意两个人是否属于同一个部落。输入格式:输入在第一行给出一个正整数N(≤104),是已知小圈子的个数。随后N行,每行按下列格式给出一个小圈子里的人:K P[1] P[2] ⋯ P[K]其中K是小圈子里的人数,P[i](i=1,⋯,K)是小圈子里每个人的编号。这里所有人的编号从1开始连续编号,最大编号不会超过104。之后一原创 2021-04-12 13:09:40 · 170 阅读 · 0 评论 -
完全二叉树的层序遍历 (25 分) - JAVA
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。输入格式:输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。输出格式:在一行中输出该树的层序遍历序列。所有数字都以 1 个空格分隔,行首尾不得有原创 2021-04-12 00:05:46 · 1673 阅读 · 1 评论 -
公路村村通 (30 分)-JAVA
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。输出格式:输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。输入样例:6 151 2 51 3 31 4 71 5 4原创 2021-04-11 22:48:50 · 578 阅读 · 0 评论 -
最短工期 (25 分) - JAVA
一个项目由若干个任务组成,任务之间有先后依赖顺序。项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。输入格式:首先第一行给出两个正整数:项目里程碑的数量 N(≤ 100)和任务总数 M。这里的里程碑从 0 到 N−1 编号。随后 M 行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。输出格式:如果整个项目的安排是合理可行的,在一行中原创 2021-04-10 11:53:24 · 949 阅读 · 0 评论