自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 PAT 1073 多选题常见计分法 (20 分)

题目传送门<==戳这本题最重要的一个问题:如何分辨 全对,半对,错误 这三种答题情况。不妨这样想:令 a = 2^0 ,b = 2^1 ,c = 2^2, d=2^3 ,e=2^4即如果选择的是a,那么该同学这道题的答案是1如果选择的是 a ,c 那么该同学这道题的答案是 1+4=5为什么要这么处理?位运算符 : ^ 异或运算符 (二进制位相同为0,不同为1) | 按位异或运算符 (二进制位有1则为1,都是0则为0) & 按位与运算符 (二进制位有0则为0,

2021-02-22 23:55:54 162

原创 PAT 甲级 1053 Path of Equal Weight (30 分)

题目传送门<==戳这一道树的遍历1.树的每一个结点储存:结点的权值,结点的儿子(vector数组动态存储)2.对于每一个结点的儿子结点数组,要对他们进行不升序排列,这样就能够优先选择儿子结点中权值较大的那个元素3.因为最后要输出总和为s的各个结点的权值,因此用path数组记录经过的结点的下标。上代码理解:#include <iostream>#include <cstdio>#include <vector>#include <algorit

2021-02-22 11:20:16 158

原创 PAT 1055 集体照 (25 分)

题目链接<==戳这这题要注意几个点:1.我们应该从左往右交替站入2.如何实现左右交替站入:把 i++ 改为 i+=2 即每次加23.利用vector的时候,如果要直接对其中的元素赋值,或者直接输入该元素,不能定义成类似于 vector < int > v ;而应该是:vector < int > v (n+1) ;(n也可以);4.用结构体储存每个人的身高和名字5.从我们的角度看,最后一排应该是输出的第一行,即多余的全部输出在第一行上代码理解:#inclu

2021-02-21 20:29:25 105

原创 PAT 1054 求平均值 (20 分)

题目传送门<==戳这这题如果用cin 或者 scanf 会比较复杂,容易wa而C语言还有两个函数:sscanf() ==> 从一个字符串中读进与指定格式相符的数据sprintf() ==> 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中简单的来说就是:格式化赋值(不太理解的往下看)上代码理解:#include <iostream>#include <cstdio>#include <vector>#include

2021-02-21 19:33:58 93

原创 PAT 1052 卖个萌 (20 分)(为什么scanf出错?)

题目传送门<==戳这一开始我用的scanf格式化输入发现只能输入样例第一行后来才发现可能会有空格。而scanf不能读入空格,因此不能用scanf。选择用getline一次性读入一整行的字符串,然后运用双指针思想,分别指向 ’ [ ’ 和 ’ ] ’再用substr截取括号内的部分,并用vector储存(长度不确定,不好开数组)。又因为有三行输入,所以采用 vector<vector< string > > 嵌套。上代码:#include <iostream&

2021-02-20 22:49:17 177

原创 二叉树的构建和遍历(例题)

直接进入正题:比如有些题目给你一颗二叉树的前序遍历和中序遍历,然后让你求层序遍历或者后序遍历。这种题目的基本思路有两个:1.给定的序列是以字符串的形式:比如后序序列:BDCA,中序序列:BADC ,然后让你求先序序列。这类问题实际上已经为你构建好了数,只需要利用字符串的截取操作(sunstr)以及dfs / bfs解决:参考文章<==戳这#include <iostream>#include <cstdio>#include <string>us

2021-02-20 11:36:16 287

原创 PAT 1050 螺旋矩阵 (25 分)

题目传送门<==戳这如图所示:我们将填写顺序分解为一圈一圈(level)。而每一个level 又分为4个部分(根据n的不同,最后一个level不一定有4个部分,但是不影响),分别对应于相同颜色的4个箭头。1.如何求level(圈数):多画几个图会发现,圈数和 “ 短的 ” 紧密相关,也就是和 lie 相关(不妨花点时间画一画),能够得出规律:level = (int)( lie / 2 + 0.5),(即 lie / 2 的值向上取整)2.如何求行(hang) 和 列(lie):开始

2021-02-19 22:47:39 82

原创 PAT 1049 数列的片段和 (20 分) 测试点2

题目传送门<==戳这总共n个元素,对于第 i 个输入的temp:1.以temp为起点的片段有:n - i + 1 个。并且这些片段都含有temp,即有:(n-i+1)个 temp2.起点小于 temp 并且经过temp的片段有 i -1 个:即以1,2 ,3…i-1 为起点,这些片段从temp这个元素开始相当于就是情况1,只是在情况1的条件下加上了temp以前的元素(这里如果不明白需要反复琢磨并自己动手画一画)即相当于有 i - 1 个情况1的片段,也就是有 ( i - 1 ) * (n -

2021-02-19 17:51:45 310

原创 PAT 1045 快速排序 (25 分)

题目传送门<==戳这这道题运用了前缀,后缀。我们用pre_max [ i ] 表示在第 i 个元素之前的最大值;而post_min [ i ] 表示在第 i 个元素之后的最小值;理解了这个思路,那就好办了,直接上代码:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const int maxn=1e5+50;int a[maxn];int

2021-02-19 15:33:02 52

原创 PAT 1025 反转链表 (25 分)

题目传送门<==戳这模拟捣鼓半天结构体结果还是只过了几个测试点。后来发现,只需要刚开始把结点记录下来,再把结点的值记录下来,还有记录该结点的下一个结点。反转链表的时候不需要对该结点的下一个结点进行修改,因为后面输出结点 list [ i ] 的时候,list [ i + 1 ] 就是下一个结点,很方便。还有需要注意的是,开始输入的结点不一定全部都是有效地结点,所以要用 list 数组进行筛选,用pos作为下标,记录有效地结点上代码:#include <iostream>#in

2021-02-18 21:33:26 79

原创 洛谷:P1259 黑白棋子的移动

题目传送门<==戳这分治思想。当n>4的时候,操作很有规律,大致可以理解为:(两颗)棋子的后移,(两颗)棋子的前移,再dfs(n-1)。而当n==4的时候,达到递归边界,此时按照题目意思将 n = 4 的情况暴力写出即可。上代码:#include <iostream>#include <cstdio>using namespace std;const int maxn=300;char a[maxn];int x; ==>x保存

2021-02-18 16:21:44 275

原创 洛谷 :P1229 遍历问题

题目传送门<==戳这当我们知道先序序列和后序序列是不能够唯一确定中序序列的。我们试想,当某个结点有两个儿子结点的时候,由先序序列和后序序列是可以唯一确定这部分的中序序列的。而当某个结点仅有一个儿子结点的时候,该儿子结点可以是左儿子也可以是右儿子,两种情况。因此,问题转化成计算这棵树仅含一个儿子结点的结点个数n,2^n即为最后答案。而独生子结点在先序序列和后序序列中顺序是相反的,代码实现如下图 if 语句上代码:#include <iostream>#include <

2021-02-18 10:10:00 155 1

原创 洛谷:P2819 图的m着色问题

题目传送门<==戳这首先建立图的连通关系,再从第一个点开始搜索,涂上对应颜色,搜索到每一个点的时候都要判断一下当前的涂色是否满足条件,如果最后一个点也能按规则涂色,说明属于一种正确的涂色方法,num++上代码理解:#include <iostream>#include <cstdio>using namespace std;int f[105][105]; ==>表示两个点是否连通int color[105]; ==>代表某个点的颜色int n

2021-02-17 23:34:11 175

原创 洛谷 P1305 新二叉树

题目传送门<==戳这先按照输入简单的构建一下这棵树,然后按照前序遍历(根 左 右)的顺序遍历这棵树即可上代码:#include <iostream>#include <cstdio>using namespace std;struct tree{ char lc; ==>左儿子 char rc; ==>右儿子}a[200]; ==>这里超级妙,数组下标可以是字符,只不过是以ASCII码的形式储存char h1,h; ==

2021-02-17 22:55:23 65

原创 洛谷:P1030 [NOIP2001 普及组] 求先序排列

题目传送门<==戳这首先了解树的遍历dfs(深搜类)先序遍历:根 左 右 ==>主根一定是第一个元素中序遍历:左 根 右 ==>唯一确定一棵树的必要条件,知道主根在中序序列中的位置可以将树分成两部分后序遍历:左 右 根 ==>主根一定是最后一个元素bfs(广搜类)层序遍历:根 ==>下一层从左到右遍历 ==>下一层从左到右遍历…到最后一层因此这道题求先序遍历就是按照 “ 根 左 右 ”的顺序输出根节点即可上代码:补充

2021-02-17 22:30:37 600

原创 洛谷 :lSP15728 ULM02 - The Sierpinski Fractal

题目传送门<==戳这递归画图问题:先找大模块的规律,将其分解为较小模块同样满足此规律,此时即可运用分治思想进行画图;n==1 /\ 能够发现,第n个形态都是由3个第n-1个形态组成(中上,左下,右下) /__\ 因此从第n个开始递归,递归边界为n==1 n==2 /\ /__\ /\ /\ /__\/__\ n==3 /\ /__\ /\ /\ /__\/__\

2021-02-17 21:26:27 101

原创 PAT 1035 插入与归并 (25 分)

题目传送门<==戳这这道题考查对 插入(选择)排序 和 归并排序 “原理” 的掌握程度,如果只是背的模板,那这道题可能会超时或没思路。原始序列==> a ,某排序算法产生的中间序列==> b关键点:1.判断排序类型:遍历b数组,第一次 b [ i ] > b [ i + 1 ] 的时候就是下一次插入排序的标志性位置;然后对从 i+1 开始遍历,如果 a [ i ] == b [ i ] 直到最后都成立,说明是插入排序,反之为归并排序;2.插入排序的下一个排

2021-02-17 00:28:50 58

原创 PAT 1034 有理数四则运算 (20 分)

题目传送门<==戳这1.这题分类原则特别重要,一不小心代码行数就会100+2.输入比较巧妙,利用了scanf的格式化输入,而非字符串3.将重复出现的操作写入函数内部,调用即可直接上代:#include <iostream>#include <cstdio>using namespace std;int gcd(long a,long b){ ==>最大公约数 if(b==0) return a; return gcd(b,a%b);}

2021-02-16 22:53:02 87

原创 PAT 1030 完美数列 (25 分)

题目链接<==戳这思路:先从小到大排序,再暴力循环枚举每一个元素作为最小值的情况时完美数列的最大长度。取最大即可。直接上代码:#include <iostream>#include <cstdio>#include <algorithm>using namespace std;typedef long long ll;const int maxn=1e5+5;ll a[maxn]; int main(){ ll n,p; cin>&gt

2021-02-16 20:33:51 61

原创 PAT 1084 外观数列 (20 分)

题目传送门<==戳这思路:其实就是将前一个数字串改变一下形式改成: 元素 个数 元素 个数 元素 个数…比如:1 ==> 1 1 (一个1)1 1 ==>1 2 (两个1)1 2 ==>1 1 2 1 (一个1和一个2)1 2 2 1 1 1 (两个1和一个2和一个1)知道怎么推导之后,直接上代码#include <iostream>#include <cstdio>using namespace std;int main(){

2021-02-16 01:48:38 104

原创 1085 PAT单位排行 (25 分)

题目传送门<==戳这直接上代码(要认真看注释哦。思路应该是比较丝滑的。#include <iostream>#include <cstdio>#include <unordered_map> ==>用map会超时#include <vector>#include <algorithm>using namespace std;const int maxn=1e5+5;struct node{ string n

2021-02-16 00:50:58 113 2

原创 PAT 1089 狼人杀-简单版(20 分)- 乙级

题目传送门<==戳这一道枚举暴力题;先枚举两个人作为狼人,然后判断所有人之中有多少个人在 talk lie,如果是2个人,再判断是否为一个狼人和一个好人,如果是则输出,否则继续循环枚举。#include <iostream>#include <cstdio>#include <map>#include <vector>#include <algorithm>using namespace std;int main(){ st

2021-02-15 16:55:31 95

原创 PAT 乙级 1090 危险品装箱 (25 分) ( map,vector嵌套,哈希判重)

题目传送门 <==戳这这题容易想到建立map映射,但是这道题并非 “一 一映射”,而是一对多。这时就想起了map和vector的嵌套,键为int,值为int数组。#include <iostream>#include <cstdio>#include <map>#include <vector>using namespace std;int main(){ std::ios::sync_with_stdio(false),cin.tie(

2021-02-15 16:27:23 85

原创 洛谷:P3613 【深基15.例2】寄包柜 ( map二维映射,vector二维嵌套)

题目传送门 <==戳 ta题解:观察数据范围,直接开二维数组 a [ maxn ] [ maxn ] 必定MLE。因此,STL的作用就体现出来了。方法一:map建立二维映射, map< int , map<int , int> > a;#include <iostream>#include <cstdio>#include <map>using namespace std;map<int,map<int,int&

2021-02-14 16:38:36 338

原创 链表的基本操作

直接进入正题1.链表结点的创建struct node{ int date; ==>链表中某结点的值 node *next; ==>链表中指向某结点的下一个结点的指针(node类型)}; 2.串联结点void link(node *tou){ ==>将头指针传入link函数内 node *p=tou; ==>负责链接工作的指针 node *q; ==>负责提供新结点的指针 for(int i=1;i<=10;i++){ ==>例如用链

2021-02-11 17:31:18 103

原创 指纹锁题解(牛客,set容器,重载运算符)

指纹锁题意:HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁。该指纹锁的加密算法会把一个指纹转化为一个不超过1e7的数字,两个指纹数值之差越小,就说明两个指纹越相似,当两个指纹的数值差≤k时,这两个指纹的持有者会被系统判定为同一个人。现在有3种操作,共m个操作1:add x,表示为指纹锁录入一个指纹,该指纹对应的数字为x,如果系统内有一个与x相差≤k的指纹,则系统会忽略这次添加操作操作2:del x,表示删除指纹锁中的指纹x,若指纹锁中多个与x相差≤k的指纹,则全部删除,

2021-02-10 23:06:11 507 2

原创 (贪心)删数算法:删的越小(大)越好

删数算法题意:N位数删除K个数字,使剩下的数字串最小思路:若a [ i ] > a [ i + 1 ] 则删除 a [ i ],如果按此规则遍历完数串但没有删够k个数字,那么从数串尾部依次删除。细节:注意前导0的处理(若N==K那也要输出0)erase后数组下标的变化从头到尾遍历,每次只删除一个数...

2021-02-09 11:49:21 141

原创 数论算法1(整除分块)

整除分块题意:整除分块,又称数论分块。是数论算法中的重要技巧,你可以在各种需要枚举因子的连续求和类问题中见到它的身影。如杜教筛,莫比乌斯反演化简后的整除分段求和等。整除分块基于这样一个数学现象:对于任意正整数N,集合 : S={ x: x = N / i , i∈1,2,3…N} 的大小总是严格小于 2sqrt (N)牛牛在学习整除分块这一算法后提出了一个新的问题,对于给定正整数N,x,令: S={ x: x = N / i , i∈1,2,3…NN / x 在S中是第几大呢(去重降序排序

2021-02-09 11:41:20 264

原创 双端队列

牛牛与交换顺序题意:牛牛有一个数组,数组元素是1到n(1<=n<=1e5)的排列,即数组的值在1~n范围内,且每个数字仅出现1次。牛牛想要将该数组变为升序排列的,他可以进行如下的操作。首先他要确定一个长度k,k的范围在1~n之间。接下来他将会进行若干次操作。在每轮操作中他都可以选择一段长度为k的子数组,然后进行区间的翻转操作。他可以做任意次数的操作,但是要求他每次选择的子数组区间满足Li<=Li+1并且区间长度等于一开始选定的k,也就是说一旦某一次操作选择了数组的某个位置进行

2021-02-09 10:43:18 110

原创 字符串

串题意:长度不超过nn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对10^9+7取模所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。例如,“unoacscc"包含子序列"us”,但"scscucu"则不包含子序列"us"输入描述:一个正整数n(2<=n<=1e6)输出描述:一个正整数,为满足条件的字符串对1e9+7取模的值题解:对可能出现的情况进行分类,在某个状态时,前面要么没有u,要么有u没有us,要么有us。则想到用dp [ i ]

2021-02-09 08:39:14 577

原创 数组模拟链表思想

题意:已知该班有n名同学,依次编号为1-n,我们首先选定编号为1的同学作为标兵,也就是我们所说的排头,然后,我们依次从编号2-n进行安排,对于编号为i的同学,我们可以指定其插入到编号为1-(n-1)之间的某一名同学的后面,当n名同学都安排好之后,此时队伍已经排成一列。然后我们要求输出每位同学后面的那个同学的编号(注意我们规定队伍最后一个同学的后面是排头的那一位同学)输入描述:首先输入一个数字n(1<=n<=2e5)表示班级的人数接下来输入n-1个数,表示编号为2-n的同学被插入到哪个同学

2021-02-08 22:41:43 103

原创 位运算的关系

easiest题意:我们给出两个数字x,y,分别表示的是a&b,a^b,请你求出a+b的值输入描述:输入两个数x,y分别表示的是a&b,和a^b(1<=x,y<=1e9)输出描述:求出a+b的值题解:a+b = 2*(a&b) + a^b#include <iostream>#include <cstdio>using namespace std;int main(){ long long x,y; //注意数据范围,最大可能

2021-02-08 17:03:39 113

原创 YEZI(map应用)

题意:我们规定一个伪叶子节点,假如这个节点只有一个节点与它相连,我们就称之为伪叶子节点。输入描述:首先输入n(1<=n<=1e6),分别表示输的节点个数和边数。节点的编号在1-n之间,并且节点编号各不相同。然后我们输入n-1行,每一行输入x,y,表示x,y之间存在一条边(x<=x,y<=n)。输出描述:首先我们要找到这个树的伪叶子结点,然后我们将节点按编号从小到大顺序排序,最后我们按照排好的顺序,输出与这些伪叶子结点相连的那个节点的编号,空格分隔。没有则不输出。题解:m

2021-02-08 16:53:54 394

原创 dfs暴力搜索

PING_PONG题意:现在给定有n张钞票,每张钞票对应一个面值,为了不让商店老板找零钱,需要让这n张钞票能够凑出1-n之间的所有数字,请问这个x的最大值是多少,如果1都凑不出,请输出0;输入描述:首先输出一个数字n(1<=n<=15),表示他们俩一共有的钞票数量,接下来n个整数,表示没张钞票的面值x(1<=x<=100)输出描述:最大化x,使得用这n张钞票能够拼凑出1-x之间所有数字,如果不存在,输出0题解:dfs深搜,每张钞票只有选和不选两种情况;#include

2021-02-08 16:22:37 193

原创 并查集

TANGGUO题意:在一个幼儿园里面有n个小朋友,分别编号1…n。在这些小朋友中有一些小朋友互为朋友关系,总共有m对朋友。作为幼儿园老师,你想买一些糖果分给小朋友,你知道第i个小朋友想要至少a【i】个糖果,否则他就会不开心。同时,如果一个小朋友得到的糖果数小于他某个朋友得到的糖果数,他也会不开心。请问你最少买多少糖果才能保证每个小朋友都不会不开心呢?输入描述:第一行以空格分隔的两个整数n,m。第二行以空格分隔的n个正整数a【i】。接下来m行每行以空格分隔的两个正整数u,v,代表u,v互为好

2021-02-08 11:35:26 122

原创 排列组合(选数,填坑问题)

排列组合(选数,填坑问题)1. 排列:(1)哈希判重递归说明:#适合每个元素互不相同的数列(有相同的会出错)#每种排列互不相同#不适合利用全排列枚举求和问题(会有重复)#include <bits/stdc++.h>using namespace std;int x[5]={0,1,2,3,4},f[5];bool hash1[5];void tiankeng(int pos,int end){ if(pos==end+1){ for(int i=1;i<=en

2021-01-27 16:53:09 361

原创 区间异或最大值

区间异或最大大意:对于一个数组a,输入一个整数n,求在[1,n]中确定两个整数t1,t2,使得t1与t2的异或值最 大。思路:第一个(严格)大于n的2次幂减1即是答案例如:n=7 , 其中 2^2 == 4 < 7 < 8== 2^3其中(1,8)的二进制值范围是(1,1000)=> 小于等于111 = 7而4=100且3=11=> 3异或4 == 111 == 7 即为最大值...

2021-01-25 22:15:14 1636

原创 快读模板(int, long long,string)

快读模板1.整形快读模板#include <bits/stdc++.h>using namespace std;inline int iread(){ int ans=0,sign=1; char ch = getchar(); while(ch<'0'||ch>'9'){ if(ch==' '){ sign=-1; } ch = getchar(); } while(ch>='0'&&ch<='9'){ ans =

2021-01-25 21:55:22 1378

原创 AcWing1561. PAT 评测 详细题解

PAT 的排名列表是根据状态列表产生的,状态列表中显示了所有提交记录的分数。现在,请你为 PAT 生成排名列表。输入格式第一行包含三个整数 N,K,M,分别表示总用户数量,题目数量,以及提交数量。用户编号是从 00001 到 N 的 5 位数字。问题编号从 1 到 K。第二行包含 K 个整数 p1,p2,…,pK,其中 pi 表示第 i 题的满分。接下来 M 行,每行包含一个提交信息,包括用户编号,题目编号,以及得分。当提交无法正确编译时,得分显示 −1,否则是一个 [0,该题满分] 范围内

2020-11-22 21:05:50 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除