- 博客(63)
- 收藏
- 关注
原创 csp 201809-3 元素选择器
解题思路:有难度的复杂模拟题。难点在于对树结构的存储,这涉及到一个数据结构的选择。可以使用二维数组存储树形结构,第一维度代表处在树中的层数(从0开始),第二维度为在该层中的编号,二维数组存储的元素代表该元素的编号(即输入数据中的行数,从0开始)。ele结构体需要存储每一个元素的父亲节点的编号(行号),标签和id。这里标签和id其实可以同样进行处理,id前的‘#’不需要单独处理,注意标签的大小写等价的,故只需要将所有大写字母提前转换成小写或者将所有小写字母提前转换成大写即可。在查找元素的时候,一个命令如果.
2020-06-10 20:03:02
256
原创 csp 201609-3 炉石传说
解题思路:一道模拟题,看似流程复杂,其实难度不大。用role结构体代表每一个英雄或者随从(也可以用pair结构实现)。两个数组a和b分别代表先手和后手的所有元素。num记录先手和后手的剩余随从个数。flag用来标记当前是先手还是后手的回合。通过字符串判断分别处理召唤随从、攻击对方和结束的命令,注意根据flag判断当前是先手还是后手的回合。在攻击结束以后注意可能需要删除随从,采用移位的思想进行删除。注意判断没有生命的是随从还是英雄,如果是英雄此时游戏应该已经结束。参考代码:#include <i.
2020-06-09 23:28:25
291
原创 区间dp(宇宙狗的危机)
解题思路:一道区间dp的问题,一开始以为要构建树,但其实不用那么复杂。所有的数据都是有序的,可以考虑区间dp。L[i][j]代表[i,j-1]是否可作为j的左子树。R[i][j]表示[i+1,j]是否可以作为i的右子树。转移条件为:if (f[l-1][root])R[l-1][r]=1; if (f[r+1][root])L[l][r+1]=1;当[l,r]为[1,n]时说明可以构建符合题意的树,如果枚举结束都到不了[1,n]说明不可以构建符合题意的树。f数组记录两点是否可以相连,即gcd是否大于1..
2020-06-04 18:27:22
348
原创 简单枚举(ZJM要抵御宇宙射线)
解题思路:看题目描述挺复杂的,有同学还会想到最小圆覆盖、dfs之类的方法,但实际上只是个简单的枚举问题。最多1000个点,n^2的复杂度的话也才1e6,直接枚举完全可以接受。pair类型数组mypoint存储每个不同编号的点的坐标。dis存储对于每个点而言到其他点的最远距离的平方。然后一次枚举计算dis数组的值,最后再找到dis最小且x最小或者x相同时y最小的点的坐标。注意选择的点一定在给定的整数点中,且输出的是半径平方,所以直接存储并比较距离的平方。因此最后输出的全是整数,可以直接多输出".00"即可.
2020-06-04 18:14:48
218
原创 简单统计(TT数鸭子)
解题思路:很简单的一道统计不同数字个数的问题,不需要使用stl(可能会超时),也不需要用long long或者int存储每个数据,把每个数字看成一个字符串,然后对每个字符是否出现进行统计,最多就10个不同的字符(0-9),最后查看该字符串的统计结果是否满足要求(即不同数字个数是否小于k)即可。参考代码:#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#i.
2020-06-04 18:03:15
416
原创 字符串哈希
解题思路:用一个map存储字符串哈希值到index的映射即可。index为对应的词条的标号(从1开始)。哈希函数使用bkdr哈希,每个字符对应的参数用其anscii码表示,mod采用unsigned int自然溢出的方式。读取字符的时候用getline读取一整行到一个string对象当中,读取完之后再对string对象进行处理。注意读取字符或字符串之前有cin或者scanf的话需要用getchar清空缓冲区。用string类型数组容易超容量,改用char类型二维数组。注意对数组赋值时使用string类..
2020-05-29 11:49:28
228
原创 模拟题
解题思路:其实题目并不难,但有很有易错点。其实时间可以转换成整数,难度会减少许多,或者像我一样定义结构体,但还要重载很多函数。把每个时间想象成分布在一个圆环上面,因为活动是循环进行的,就在圆环上遍历即可,不需要考虑天与天之间的界限。然后先把所有的需要醒着的时间段放在awake数组里,然后检验那些其他时间段能睡觉吗,能的话放在sleep数组里,不能的话检验能否和相邻时间段合并,不能的话直接无解,可以的话进行合并。注意这里可以真的合并,但容易出错,推荐用一个last表示上一个醒着的时间段会简单很多。最...
2020-05-23 16:06:19
318
原创 区间动态规划
解题思路:区间dp问题,dp[i][j]表示只考虑区间[i,j]时的最长满足条件的序列的长度。从长度为2的序列开始遍历,如果(s[i]’(’&&s[j]’)’)||(s[i]’[’&&s[j]’]’)成立则dp[i][j]=dp[i+1][j-1]+2,这是将s[i]和s[j]组成一组的情况,否则dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]),其中i<=k<=j,这是不将s[i]和s[j]组成一组的情况。参考代码:#i...
2020-05-12 18:33:39
214
原创 任务安排(动态规划)
解题思路:采用状态压缩的思路,将每一种状态用二进制数据表示(实际用int类型十进制数据表示,因为n足够小)。从0开始一直遍历到全1,即表示从不选择所有任务增加到选择所有的任务,每一种情况单独考虑。dp状态f[s]即表示对应于状态s的最小值即答案。注意没有答案为-1所以对f数组初始化为-1,f[0]=0(表示不选择任何任务进行完成)。dp状态转移方程为:另外,为了保证字典序最小,只有当之后的dp值严格大于当前dp值时才对dp进行更新。参考代码:#include <iostream>..
2020-05-12 16:50:52
1745
1
原创 动态规划
解题思路:明显需要采用动态规划的思想解决,一般想法是用二维数组元素dp[i][j]表示求和次数为i次,仅考虑前j个元素的答案。但需要尽量想办法把二维数组转化为一维数组。我们用f[j]表示考虑的求和次数比当前的求和次数少1时的最大值,及上一个状态的答案,可得到状态转移方程:dp[j]=max(dp[j-1]+a[j],f[j-1]+a[j]);分别表示a[j]连着a[j-1]以及a[j]单独作一次求和的情况。参考代码:#include <iostream>#include <cs..
2020-05-12 15:33:49
237
1
原创 三维迷宫
解题思路:一道典型的迷宫寻最短路径问题,类似于之前二维迷宫的思路,只是一切数组都改为三维的了。依然不需要vis数组,用dis数组就可以实现这个功能。用point结构体类型的队列实现bfs的搜索,注意point结构体也是三维的,每个点有六个移动方向。注意读入的先是z维长度,再是x和y的长度。参考代码:#include <iostream>#include <cstdlib>#include <cstdio>#include <cmath>#i...
2020-05-11 22:34:18
1461
原创 个数统计问题
解题思路:简单的题目,用map来存储数字-出现次数的序列,每次读入先判断是否存在这个数。最后遍历map容器找到出现次数大于等于(n+1)/2的整数并输出。参考代码:#include <iostream>#include <map>#include <vector>#include <utility>using namespace std;map<int, int> m;int n;int main(int argc, con..
2020-05-11 10:45:18
188
原创 回文子串
解题思路:看起来很复杂的题目,我是通过动态规划求出来了所有的回文序列的左右端点的值,然后对每个子序列的单独进行判断是否是符合要求的子序列,只过了5个测试点。其实这道题和一般的回文序列问题不大一样,它只有A和B两个字母,所以关键是找到不满足要求的子序列的形式,只有四种:ABBB…,BAAA…,AAA…B,BBB…A,然后计算出这四种类型的子序列的个数,由子序列总数减去这四种类型的子序列的个数即可。注意我们只考虑长度大于等于2的子序列,单个字母一定不符合要求。计算这四种类型的子序列的个数时,从前向后遍历,遇.
2020-05-10 11:05:29
310
原创 消除游戏
解题思路:考虑到有些元素会被重复消除,不能实时消除,可以使用记录坐标的动态数组记录下来待消除元素,最后统一置零。消除分两步,先一行一行的消除,再一列一列的消除,相邻的三个即以上的元素都加入到数组当中即可。参考代码:#include <bits/stdc++.h>using namespace std;int n,m;int a[35][35];vector<pai...
2020-05-07 09:03:34
566
原创 连续序列问题
解题思路:简单题,注意不需要开数组,两个数x和y分别记录上一个数和当前数进行比较即可。最后的ans需要加一因为这里漏掉了第一个连续序列。参考代码:#include <bits/stdc++.h>using namespace std;int main(){ int ans=0; int n;cin>>n; int x;int y;//x:...
2020-05-07 08:57:12
567
原创 0-1背包
解题思路:典型的0-1背包问题,唯一的区别在于需要输出选择的背包的value。因为是special judge,所以不需要考虑输出的顺序,当f[j-w[i]]+w[i]>f[j]条件满足时,代表该物品被选中,注意j需要从V到0逆序递减,此时记录p[i][j]为1,之后再次遍历p数组,当元素值为真时输出对应物品的价值即可。注意这里的物品价值和体积均对应于唱片播放时间。参考代码:#in...
2020-05-05 10:49:30
135
原创 多重背包
解题思路:这其实是一个多重背包的问题,每一次的cash对应于背包的容量,钱的种类即为物品的种类,注意这里钱的面值对应于物品的价值和体积,然后用二进制拆分将多重背包化为0-1背包问题来解决,这里转化后的vv和ww数组也只是同一个数组newarr。注意,最多只有10种钞票,数组a和c的大小设置为15即可,cash最大值为100000,f大小设置为100005,newarr大小应该与新的物品总个数...
2020-05-04 18:32:00
263
1
原创 1-2序列
解题思路:注意到序列只有1和2,先统计出连续的1和2出现的次数,由于1和2的整体是交替依次出现的,挨在一起的1和2序列将只取决于其中个数较小的那一个序列,每一次用min求更小的那一个序列,注意最后需要找到最小值的最大值,然后乘以2即可(目标序列既包括1也包括2)。参考代码:#include <iostream>#include <algorithm>using...
2020-05-04 10:56:51
342
原创 解码问题
解题思路:主要就是一个字符转换问题,分情况对字符的anscii码进行转换即可,不是大写字母的不转换,注意scanf和cin都会在空格处停止读入,这里要求读取空格并输出,我们使用getline函数配合string类来读取一整行字符串,getline函数并不会在空格处停止读入。参考代码:#include <iostream>using namespace std;int co...
2020-05-03 18:04:19
428
原创 矩阵旋转问题
题意:蒜头君的班级里有 n^2个同学,现在全班同学已经排列成一个n∗n 的方阵,但是老师却临时给出了一组新的列队方案,为了方便列队,所以老师只关注这个方阵中同学的性别,不看具体的人是谁,这里我们用0表示男生,用1表示女生,现在蒜头君告诉你同学们已经排好的方阵是什么样的,再告诉你老师希望的方阵是什么样的,他想知道同学们已经列好的方阵能否通过顺时针旋转变成老师希望的方阵1、不需要旋转则输出 02...
2020-05-03 17:45:45
454
原创 买房问题
题意:蒜头君从现在开始工作,年薪 NN 万。他希望在蒜厂附近买一套 6060 平米的房子,现在价格是 200200 万。假设房子价格以每年百分之 KK 增长,并且蒜头君未来年薪不变,且不吃不喝,不用交税,每年所得 NN 万全都积攒起来,问第几年能够买下这套房子?(第一年年薪 NN 万,房价 200200 万)输入:一行,包含两个正整数N(10≤N≤50),K(1≤K≤20),中间用单个空格隔...
2020-05-03 16:59:37
407
原创 团队聚会问题(Time Planner)
解题思路:构造时间结构体的思路很容易想到,成员包括年份、月份、日期、时、分和秒。重构一些比较、赋值函数。用三个数组分别存储每个人的任务的开始时间,结束时间和所有的时间节点(包括总的开始时间和结束时间)。这个记录所有的时间节点的数组t非常重要,用来作为寻找公共时间的载体。我们把这些时间节点排序后想象成在一个一维坐标线上,我们从前向后遍历寻找符合要求的最大时间段,而每一个时间段由左端点l和右...
2020-04-26 11:35:25
715
原创 简单染色问题
解题思路:很简单的染色问题,只要三个边长有一个是偶数,就可以对半分,差的绝对值的最小值为0.否则,沿着横截面积最小的平面进行切分,差的绝对值的最小值为最小的两个边的乘积。先判断是否有偶数,不存在偶数再排序后求最小的两个数的乘积即可。注意事项:每条边最大长度为10^9,可以用int存储,但需要将两个最小边相乘,相乘后结果可能会溢出。long long参考代码:#include <...
2020-04-24 20:15:59
761
原创 LIS & LCS
题意:有两个序列A和B。想要知道序列A的LIS和序列AB的LCS的长度。注意,LIS为严格递增的,即a1<a2<…<ak(ai<=1,000,000,000)。输入:第一行两个数n,m(1<=n<=5,000,1<=m<=5,000)第二行n个数,表示序列A第三行m个数,表示序列B输出:输出一行数据ans1和ans2,分别代表序列A的L...
2020-04-24 17:36:21
296
原创 拿数问题
题意:给一个序列,里边有 n 个数,每一步能拿走一个数,比如拿第 i 个数, Ai = x,得到相应的分数 x,但拿掉这个 Ai 后,x+1 和 x-1 (如果有 Aj = x+1 或 Aj = x-1 存在) 就会变得不可拿(但是有 Aj = x 的话可以继续拿这个 x)。求最大分数。输入:第一行包含一个整数 n (1 ≤ n ≤ 10^5),表示数字里的元素的个数,第二行包含n个整数a1...
2020-04-24 12:15:34
454
原创 简单题目
题意:开始他有一个数字n,他的目标是把它转换成m,在每一步操作中,他可以将n乘以2或乘以3,他可以进行任意次操作。输出将n转换成m的操作次数,如果转换不了输出-1。输入:输入的唯一一行包括两个整数n和m(1<=n<=m<=5*10^8).输出:输出从n转换到m的操作次数,否则输出-1.输入、输出样例:Simple Input 1120 51840Simple O...
2020-04-24 08:41:27
297
1
原创 目录管理(directory management)
解题思路:这道题的大体框架就在于两个结构体,一个command(命令),一个directory(目录),一条命令不单有命令形式,还有命令参数,比如“MKDIR s”等等,所以还需要进行参数的分离,同类信息需要聚集,所以将它封装成command结构体更好处理。将七种命令封装成常量数组cmdnames,command结构体还包括type表示命令种类,arg存储参数(可能存在)以及记录刚刚操作设计的...
2020-04-19 15:26:04
588
原创 扑克牌模拟
题意:游戏规则:所有扑克牌只按数字来算大小,忽略花色。每张扑克牌的大小由一个值表示。A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K 分别指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。每个玩家抽得 5 张扑克牌,组成一手牌!(每种扑克牌的张数是无限的,你不用担心,东东家里有无数副扑克牌)理所当然地,一手牌是有不同类型,并且...
2020-04-17 12:24:03
1383
原创 简单模拟
题意:公园有 x 条长凳。第 i 个长凳上坐着 a_i 个人。这时候又有 y 个人将来到公园,他们将选择坐在某些公园中的长凳上,那么当这 y 个人坐下后,记k = 所有椅子上的人数的最大值,那么k可能的最大值mx和最小值mn分别是多少。输入:第一行包含一个整数 x (1 <= x <= 100) 表示公园中长椅的数目第二行包含一个整数 y (1 <= y <= 10...
2020-04-17 09:00:27
285
原创 强连通分支问题
题意:大学班级选班长,N 个同学均可以发表意见,若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 。现在收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学。输入:本题有多组数据。第一行 T 表示数据组数。每组数据开始有两个整数 N 和 M (2 <= n <= 5000, ...
2020-04-15 00:32:37
212
原创 拓扑排序应用问题
题意:猫猫比赛。一共有 N 只猫猫,编号依次为1,2,3,…,N进行比赛。比赛结束后,会为所有的猫猫从前到后依次排名。每场比赛的结果都记录了下来,现在编程确定字典序最小的名次序列。输入:输入有若干组,每组中的第一行为二个N(1<=N<=500),M;其中N表示猫猫的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示编号为 P1 的猫猫赢了编号为 ...
2020-04-14 20:58:32
227
原创 差分约束-区间选点问题
题意:给定一个数轴上的 n 个区间,要求在数轴上选取最少的点使得第 i 个区间 [ai, bi] 里至少有 ci 个点。输入:输入第一行一个整数 n 表示区间的个数,接下来的 n 行,每一行两个用空格隔开的整数 a,b 表示区间的左右端点。1 <= n <= 50000, 0 <= ai <= bi <= 50000 并且 1 <= ci <= bi...
2020-04-14 20:46:24
316
原创 数字序列问题
解题思路:这个序列的结构如上图所示,很明显求解第k个数字是什么需要分两步走,第一步求解所在的行,第二部求解所在的列即该行中的什么位置。首先看怎么求解第k个数字所在的行,我们发现当某一行的最后一个数的位数为w时,这一行的数字个数与相邻行的数字个数的差为w,即局部范围内成等差数列(具有相同位数的最后一个数的行)。我们就按照每行的最后一个数的位数来划分所有的这些行使得它们组成一个个的等差数列。根据等...
2020-04-13 11:54:46
841
原创 英文序列问题
解题思路:首先将整个字符串读到char数组中(或者string类当中),然后我们注意到前三个测试点刚好是26个字符,可以对他们单独考虑一波。这里用一个数组去记录每一个字母出现的次数,读取完毕将未出现的字母压入小根堆里面,若未出现字母个数大于问好个数则输出-1,否则依次输出字母,遇到问号则从小根堆中pop出字母输出即可保证字典序最小。而对于其他样例,我们用滑动窗口的思路,滑动窗口用队列实现,每次...
2020-04-10 15:58:56
369
原创 序列问题
解题思路:解题思路很简单,关键是弄清楚哪些序列满足要求。不同数的种类为1,2时满足要求,大于3时不满足要求,等于3时,当这三个数中较大数(max)-中间数(mid)=中间数(mid)-较小数(min)时,这样的序列满足条件,变形一下得到max+mid+min=3mid。我们用两个bool变量flag_y,flag_z来判断是否出现新的数据,如果没有出现则不同数的种类为1,2,此时满足要求。如果...
2020-04-10 13:25:23
1126
原创 SPFA Algorithm
题意:有 N 个商业城市,编号 1 ~ N,其中 1 号城市是 TT 所在的城市,即首都。喵星上共有 M 条有向道路供商业城市相互往来。但是随着喵星商业的日渐繁荣,有些道路变得非常拥挤。正在 TT 为之苦恼之时,他的魔法小猫咪提出了一个解决方案!TT 欣然接受并针对该方案颁布了一项新的政策。具体政策如下:对每一个商业城市标记一个正整数,表示其繁荣程度,当每一只喵沿道路从一个商业城市走到另一个商业...
2020-04-07 21:36:05
131
原创 Dijkstra Algorithm
题意:TT 从家里出发,准备乘坐猫猫快线前往喵星机场。猫猫快线分为经济线和商业线两种,它们的速度与价钱都不同。当然啦,商业线要比经济线贵,TT 平常只能坐经济线,但是今天 TT 的魔法猫变出了一张商业线车票,可以坐一站商业线。假设 TT 换乘的时间忽略不计,请你帮 TT 找到一条去喵星机场最快的线路。输入:输入包含多组数据。每组数据第一行为 3 个整数 N, S 和 E (2 ≤ N ≤ 5...
2020-04-07 21:17:34
198
原创 Floyd Algorithm
题意:N 个人玩一个游戏,每两个人都要进行一场比赛,已知M个胜负关系,每个关系为AB,表示A比B强, 胜负关系具有传递性,试问有多少场比赛的胜负无法预先得知?(1≤????,????≤500)输入:第一行给出数据组数。每组数据第一行给出 N 和 M(N , M <= 500)。接下来 M 行,每行给出 A B,表示 A 可以胜过 B。输出:对于每一组数据,判断有多少场比赛的胜负不能预先得知...
2020-04-04 13:50:21
324
原创 扑克牌模拟
题意:东东有 A × B 张扑克牌。每张扑克牌有一个大小(整数,记为a,范围区间是 0 到 A - 1)和一个花色(整数,记为b,范围区间是 0 到 B - 1),扑克牌是互异的,也就是独一无二的,也就是说没有两张牌大小和花色都相同。“一手牌”的意思是你手里有5张不同的牌,这 5 张牌没有谁在前谁在后的顺序之分,它们可以形成一个牌型。 我们定义了 9 种牌型,如下是 9 种牌型的规则,我们用“低...
2020-03-27 21:49:14
745
原创 最小生成树问题二(csp 201812-4 数据中心)
解题思路:很容易看出这是求最优生成树的问题,这里最优的条件是Tmax最小,而Tmax=max(Th),而Th=max(t h,j),不难推出两层max的作用使得Tmax就是整棵树的最长边,所以等价于求最长边最小的生成树的问题。要使得最大值最小,可以二分答案,也可以利用最小生成树的性质。最小生成树一定满足整棵树的最长边最短,反之不然,故我们只需要求出最小生成树即可,依然用并查集实现的Kruska...
2020-03-27 10:24:32
193
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人