01 2020 档案
摘要:题目大意: 给定两个字符串s和t,你有一个空字符串z 每次可以取s的任意一个子序列加到z后面 问至少要取多少次才能让z等价于t 解题思路: vector存s中26个字母的位置 然后t字符串从前往后一个个查找 用变量p记录查到上一个字符时在字符串s中的位置(初始化为-1) 如果在t内碰到一个字符,没有
阅读全文
摘要:题目大意: 给定一个长度为n的字符串s,由字符0和1组成 你可以让这个字符串s无限延长 就令字符串t=sssssss...... 求字符串t有多少个前缀字符串中,0的个数减去1的个数等于x 解题思路: 本文可能讲的很复杂……不知道多套了几个例子进去会不会好点…… 对于一个周期,可以先记录前缀和到某个
阅读全文
摘要:“选出来三个六学家,他们的编号是i,j,k,满足i<j<k,且a[k]=a[j]-a[i]” 所以输入第i个数a[i]时,直接让答案加上前i-1个数中能构成差值为a[i]的数量即可 然后让此时输入的数作为上式中的a[j],将i-1到1作为a[i],列出i-1个可能的a[k]存起来即可 时间复杂度为O
阅读全文
摘要:分开考虑k=1 k=2和k>=3的情况 2和3这两个质数比较特殊,遇到的话直接输出1就行 对于“神灵的不满意度为m的约数中,比m小且最大的那个”这句描述,指m除了自身和1这两个因子里找最大的那个 可以从2找到sqrt(m),根据因子总是成对出现(除了sqrt(m)),所以找到一个最小因子i就可以把m
阅读全文
摘要:大模拟,但是题目好像有些地方表述不清 根据UNO在初中曾被别人虐了很久很久的经历 猜测出了原本的题意 本题中的+2虽然有颜色,但是也可以当作原UNO游戏中的+4黑牌 即在某人出了+2后,可以出不同颜色的+2更改场上的颜色 在+2环节,如果一个人除了+2,下一个人如果有+2,就可以把+2出出去,这一回
阅读全文
摘要:由题意得,如果有个人从前往后能找到第一个不低于自己等级的任务,就会接取其后所有任务 那么就可以让输入数据处理成递增数列 例如1 3 5 4 6 2 7 7 3 可以处理成1 3 5 5 6 6 7 7 7 因为进来的成员总是从前往后看,所以只要每次查找剩余的任务里第一个大于等于它的等级的即可 如果没
阅读全文
摘要:为4的倍数,列出所有可能情况再判断即可 处理输入的数据对4取模 可得 4444 2244 2222 1111 3333 1133 1223 1344 1124 3324 共十种情况 所以得出答案 #include<bits/stdc++.h> using namespace std; int mai
阅读全文
摘要:明显,总共有n*m格,已经涂了k格 所以剩下n*m-k格 如果n*m-k<=k,即k已经占用了大于等于一半的格子,显然答案为0 否则 剩下的格子中取k+1,k+2...n*m-k格均可 取组合数求解,所以答案为 但因为组合数下标太大 可以处理杨辉三角(推荐) 或者处理因子 或者使用Python或者J
阅读全文
摘要:(夏华献在学校也要做一次梦!) 把5的答案手动算出 会发现从学校开始,兔子的数量呈斐波那契数列(第2项开始)增长 假如现在有n盏路灯 那么睡觉的时间可以得到为 但是n有1e18大,明显使用标准数学公式不可行 所以,我们来找答案的规律叭 根据样例 in 4 out 12 in 6 out 48 又因为
阅读全文
摘要:把一位数、两位数、三位数……这些所在的范围分开判断 可得1~9这些数范围在[1,9]内 10~99内共有90个数,每个数占两位,所以共有180位在,范围在[10,189]内 同理,100~999内共有900个数,每个数占三位,所以共有2700位在,范围在[190,2889]内 …… 最后对于范围,可
阅读全文
摘要:枚举猜答案…… 因为速度值保证各不相同 所以n只战斗人形会出现 n! 种不同情况 可以用不同id表示不同人形的速度 比如1 2 3三只人形 他们可能的排列有 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 6种情况中,每种情况最后存活的人形有 3 2 2 2 1 1 期望为1
阅读全文
摘要:d为1代表Alice执刀,-1代表Bob执刀记录蛋糕数字为奇数和偶数各自的数量,先看偶数块 如果为偶数的蛋糕为奇数块,则为偶数的蛋糕切完后是Bob持刀,Alice会多吃1,此时要将奇数块蛋糕-1(假设此时有为奇数的蛋糕,如果没有根据题意依然是Alice赢) 如果为奇数的蛋糕为奇数块,两人每次切时对方
阅读全文
摘要:Mr.Lee每隔1/x s攻击一次,cpu每隔1/y s攻击一次 因为时间与答案无关,最后只看boss受到了多少次攻击 所以可以在每个人的频率上同时乘以xy 即Mr.Lee每隔y s攻击一次,cpu每隔x s攻击一次 这样看虽然时间延长但是结果不变 就可以二分查找出打败boss用时,最后再根据时间判
阅读全文
摘要:在图的最外面套一层0(防止到头) 然后搜索图有多少块在 '0'有两块0,一块1 '1'有一块0,一块1 其余情况不存在 #include<stdio.h> int n,m,z[2],dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; char s[102][103]; void d
阅读全文
摘要:开纵横两个结构体数组,记录连续涂了一整行或者一整列的情况 再开一个map,记录涂点 #include<iostream> #include<algorithm> #include<map> #include<utility> using namespace std; typedef pair<int
阅读全文
摘要:我猜这个数列可以直接从大到小凑…… 推出帕多瓦数列每一项,从大到小循环 遇到小于等于x的项就减掉这一项 全部循环完毕后判断x是否为0即可 #include<stdio.h> typedef long long ll; ll a1,a2,a3,d[50]; void cal(){ ll a4=a2+a
阅读全文
摘要:在dfs过程中加上栈记录当次dfs走过的路径 如果当次dfs到了一个之前的dfs已经经过的点 又因为只对没有访问过的点开始dfs 所以这种情况就说明接下来不可能返回到当次dfs开始的点 将栈内元素取出,恢复vis状态为未访问过,起始点保持访问过状态(说明这个点不可用) 最后找最优解 #include
阅读全文
摘要:对于n*m网格 取min(n,m)作为最大的正方形边长 则答案可以表示成 s=1~min(n,m) 对于一个s*s的正方形 用oblq数组储存有多少四个角都在这个正方形边上的正方形 以4*4为例 除了4*4自身外,四个角在边上的正方形还有 所以4*4网格最多可以有4种正方形存在 推出s*s网格最多可
阅读全文
摘要:因为成环 所以可以枚举第1只与第n只喂的次数 然后第1只和第2只的次数就固定了,以此类推,则所有宝可梦喂的次数都固定了 最后处理完检查是否全为0,不是则进行下一次枚举,是则直接输出Yes 如果所有枚举均不成立,输出No #include<bits/stdc++.h> using namespace
阅读全文
摘要:将辈分差距转为数字 例如 A 是 B son A=B-1 A 是 B grandfather A=B+2然后编号1数字设置为0,建图bfs 最后搜索编号2到100是否存在>0的数即可 #include<bits/stdc++.h> using namespace std; typedef pair<
阅读全文
摘要:可得应当优先寻找最大的2^n-1这个数 如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1) 如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最高位继续寻找 例如 l=10 r=14 即1010~1110 B l和r位数相同且r不全为1 则可以
阅读全文
摘要:从小到大排序后 先固定一遍,另外两边递增查找 即固定 i,j=i+1,k=j+1 然后让k递增到 a[i]+a[j]<=a[k] 时 此时不能凑成一个三角形 答案增加 k-1-j 组 此时不需要重置 k=j+1 因为 j++ 后 a[j] 会变大 那么在 j~k 之间的所有木棍长度均能再次满足这种
阅读全文
摘要:Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为0 拿奇数阶进行Nim博弈即可 #include<stdio.h> int main(){ int
阅读全文
摘要:因为从俯视图看,输入输出的视角是从右下方看向左上方的 所以左上角的正方体最有可能被其他正方体挡住 立体上,底部的正方体最有可能被顶部的正方体挡住 所以绘图应该从后往前,从下往上绘制 剩下的就是一大堆计算和判断了 采用的是先绘制出规范的图再与输入的图做对比的方式 #include<stdio.h> #
阅读全文
摘要:因为是从(0,0)点开始以1,3,9,27,....的步数走的 其实可以每走一步后,以机器人为中心,平面所有坐标全部缩小3倍 那么本应该走3步的路现在只需要走1步就可以到达那个点 那么对于机器人来说这种变化意味着什么 走一步,缩小3倍,再走一步,再缩小3倍 以原点(0,0)为参照物,机器人走的距离确
阅读全文
摘要:可以将相同的人数分块存在数组gp中先 例如RRGGGRBBBBRR 则gp[1~5]={2,3,1,4,2} 首先可以知道,如果要让没有相邻的相同,只需要每个gp[i]/2向下取整即可得出最少需要改变的个数 例如RGGGR,只看G,只需要改变中间的G即可 例如RGGGGR,只看G,可以选择改变1和3
阅读全文
摘要:类似于1213取水 可以把空投当作第0个城市 最后将0~n的所有城市跑最小生成树 #include<iostream> #include<algorithm> using namespace std; struct road{ int from,to,cost; bool operator < (c
阅读全文
摘要:注意到N最大只有1e6,但是xy最大有2e8,直接模拟2e8会超时 所以可以将1e6个区间离散化后模拟,模拟时的最坏情况为2e6满足题意 #include<iostream> #include<algorithm> using namespace std; int x[1000010],y[1000
阅读全文
摘要:完全弹性碰撞可以视作互相穿过 所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可 最后以30000为界分开流读入与缓冲区优化的io方法 //Case4用缓冲区io优化会WA?? #pragma GCC optimize(3) #include<iostream> #include<algo
阅读全文
摘要:取模运算在数组内循环解密,否则会MLE #include<stdio.h> char cm[210],cn[1000010]; int main() { int i,j,s1,s2,n,m,l,k; scanf("%d%d%d%d%s%s",&n,&m,&l,&k,cm,cn); for(i=(n-
阅读全文
摘要:寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索dis1[i]+dis2[i]值最大的输出 #include<bits/stdc++.h> #def
阅读全文
摘要:每次都寻找长度为k的区间内的最小值显然很容易超出时间限制 所以可以把窗户看作一个数量固定的队列 每次观察入列与出列的元素对答案贡献如何,以更新答案 #include<stdio.h> int tmp[1000010],max[1000010]; int gmax(int i,int k) { int
阅读全文
摘要:因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 #include<stdio.h> #include<memory.h> int N,M,dx[4]={1,0,-
阅读全文
摘要:追踪1号队员,取他回到原来位置需要的次数 #include<stdio.h> int main(){ int T,t,n,ans,x; scanf("%d",&T); for(t=1;t<=T;t++){ scanf("%d",&n); ans=x=1; while(x!=n+1){ if(x>n)
阅读全文
摘要:根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把这些块当作信号发出源,就可以使全图都能够收到信号 所以答案就是入度为0的块的数量 (因为跑完程序刚好
阅读全文
摘要:在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y=-x^2函数的图像 所以就可以根据三分法找出最值点 #include<stdio.h> doubl
阅读全文
摘要:打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最后1e9整无法枚举到 特判一下 #include<bits/stdc++.h> using name
阅读全文
摘要:因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≈46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除
阅读全文
摘要:将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对于航线左边的位置序号已经是排好序的了 那么只需要考虑右边的情况 在所有只开通1条航道的组合中 右侧出
阅读全文
摘要:某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这个N+1村庄相连,才能保证所有村庄有水 而村庄i连接到村庄N+1的费用,就可以直接理解为打井的费用W
阅读全文
摘要:双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意OJ上的数据存在问题:冒号后跟一个空格,CHARLES的话最后的句号‘.’应为半角,非全角) 可用样例输入: 3 1 5 MIK
阅读全文
摘要:大模拟,空想很容易把面和面之间的关系搞混 所以这时候需要自己找一个正方体(实在不行长方体代替)跟着图把每个面正方向标出来 然后模拟6种操作分别会对哪些块进行操作 对于储存数据的想法是,对输入输出进行分块,以c[i][j]表示是第i个面的第j块 具体参照下文输入输出内的 for(i=0;i<3;i++
阅读全文
摘要:1、如果一个单元为0,表示没做过这题,不计入成绩 2、如果一个单位为负数,表示做错了这题,不计入成绩 所以只要一个单元为正数(不论是否有括号)都说明做出了这一题,计入成绩 将名字和成绩都当作字符串读入,方便处理含有括号的情况 字符串读入后检查末尾是否为')'即可分开判断有无括号的情况(如果有括号,成
阅读全文
摘要:题目大意: 给定一个n*m的矩阵 可以更改任意一个位置的值 也可以选择一整列全部往上移动一位,最上方的数移动到最下方 问最少操作多少次可以把这个矩阵移动成 1 2 3 ... m m+1 m+2 m+3 ... 2m ... (n-1)m+1 (n-1)m+2 (n-1)m+3 ... nm 解题思
阅读全文
摘要:题目大意: 每次都会往你的数列里加一个值,你可以任意加减这个值若干次(但是只能加x或者减x) 然后问最小的不属于这个数列的非负整数是什么 你需要进行的操作是,让这个最小的不属于这个数列的非负整数最大 每次加一个值并且询问一遍 解题思路: 易得到,每一次输出的答案在进行完题目的贪心后会呈现上升趋势,且
阅读全文
摘要:题目大意: 给定一个n,问是否存在3个互不相同的,大于等于2的整数,满足a*b*c=n 解题思路: 可以把abc其中任意两个看作一个整体,例如a*b=d,那么可以发现d*c=n 所以d和c是n的因子 易得a和b也是n的因子 所以可以往n的因子这方面去考虑 题目就变成,是否存在3个不互相同的且大于等于
阅读全文
摘要:题目大意: 机器人从(0,0)开始,他只能往上'U'或者往右'R'走 坐标系中有着很多包裹,分别在一些点上 机器人需要走过去把这些包裹全部收集起来 问能不能做到 如果能,再输出移动方式,相同移动方式输出字典序最小的方案 解题思路: pair或者结构体排序,x与y的优先级任意,因为下一个包裹必定在当前
阅读全文
摘要:题目大意: 给定n个序列,每个序列元素个数严格相等于m 你需要找到两个序列a[i]和a[j],使其每个对应位置的元素取大后得到b序列 b[k]=max(a[i][k],a[j][k]) 且让b序列中的最小值最大 i可以等于j 解题思路: 二分假设这个b序列的最小值的值x 将a序列转化成01构成的二进
阅读全文
摘要:题目大意: 给定n和m,有两个数组,两个数组的长度都等于m 数组内每个元素都在1到n中 对于两个数组对应的位置i,必须满足a[i]<=b[i] a数组必须是不下降的序列 b数组必须是不上升的序列 求有多少种ab数组的排列方案满足上述题意 解题思路: 因为a不下降,b不上升,所以a总体呈上升趋势(或趋
阅读全文
摘要:题目大意: 令conc(a,b)函数得出的结果为将ab拼接得到的数字。 例如:conc(12,23)=1223 a和b不会包括前导0! 接下来,你已知A和B,问有多少对的(a,b)满足 1≤a≤A , 1≤b≤B a*b+a+b=conc(a,b) 解题思路: 想法题,只需要满足b这个数字每一位全为
阅读全文
摘要:题目大意: Adilbek有一个特殊项目,他需要运行这个项目得到结果。 但是这个项目直接运行需要消耗d天时间。 他也可以选择优化程序以减少程序运行消耗时间。 假设他用了x天优化程序,那么最后运行程序只需要消耗天的时间(括号指向上取整)。 那么总共需要消耗的天数是。 问,他能不能在n天内得到结果? 解
阅读全文
摘要:题目大意: Aroma想要找数据第0个数据再x0,y0这个点其后所有数据所在的坐标点满足x[i]=x[i-1]*ax+bxy[i]=y[i-1]*ay+byAroma一开始在点(xs,ys),她最多只能走t步两点间的距离用Δx+Δy表示问Aroma最多能走到多少个点(找到多少个数据)? 解题思路:因
阅读全文
摘要:题目大意: 有一个2*n的图 NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点 每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过 每操作一次要回答一次NEKO#ΦωΦ能不能带领他们走到那里 解题思路: 用cnt记录不能走的种类数两个数组,分别对应r为1和r为2值用0和
阅读全文
摘要:题目大意: ConneR老师想吃东西,他现在在大楼的第s层,大楼总共有n层,但是其中有k层的餐厅关门了。 然后给了这k层关门的餐厅分别所在的楼层。 所以问ConneR老师最少得往上(或者往下)走几层楼,才能到最近的还开门的餐厅就餐? 解题思路1: 对于关闭的k层,存在数组a里排序。(放在1~k的位置
阅读全文
摘要:状态转移 b[i]记录价值为i的单词种类数 d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50 表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转移而来 最后统计即可 #include<stdio.h> int main(){ int T,t,i,j,k,a[27]=
阅读全文
摘要:二维图的动态规划 因为不能穿越对角线,则选取对角线的一边dp即可 选取对角线右下侧 则x轴上每个点只能由其左侧的点走过去(只有1条) 对角线上的点只能由对角线下方的点走过去 其他点可以由左侧和下侧两种方式到达 因为对角线左上和右下均可 所以答案*2 #include<stdio.h> long lo
阅读全文
摘要:推出n=1到4时,An排列的种类数分别为 1 4 15 64 可得 (1+1)*2=4 (4+1)*3=15 (15+1)*4=64 ... 故用一数列r[n]记录An的种类总数 当n=3时,列举出以下15种从大到小的排列 1 1 2 1 2 3 1 3 1 3 2 2 2 1 2 1 3 2 3
阅读全文
摘要:只需求出乌龟最短耗时跟兔子耗时比即可 将起点 0 和终点 N+1 也看做充电站,进行动态规划 对第i个点进行动态规划,则可以得到状态转移方程为 dp[i] = max{dp[j]+time[i][j]} j∈[0,i] time[i][j]=max(不充电从i到j耗时 , 在i充满电后再到j耗时)
阅读全文
摘要:枚举区间可能的长度len,将m减去1~len构成的序列和后如果结果是len的倍数,则可以构成答案区间。 #include<stdio.h> #include<math.h> int main(){ int n,m,len,b; while(scanf("%d%d",&n,&m)!=EOF&&(n||
阅读全文
摘要:处理后再判断即可,处理过程注意考虑全面。 #include<iostream> #include<string> using namespace std; string s[2]; void shape(int n){ int i,pj=0,len=s[n].length(),p=0; if(s[n
阅读全文
摘要:栈运用的模板题,对于符号进行出入栈操作,每次与栈顶的符号进行优先级判断,得出第一行后缀表达式。 在其后的化简计算中,每次用一个特殊符号(代码中使用了'?')代替原来的计算结果引用,并开一个数组表示每次的计算结果,之后搜索到'?'时用这个结果进行代入计算。 直到只剩下一个数字,停止程序。 #inclu
阅读全文
摘要:打表处理(Case 1超时) 对m进行枚举,每次枚举进行一次判断 因为好人坏人均为k个,那么只要让下一个死亡的人的位置p保证在1~剩余坏人数量之间即可,不满足则直接break枚举下一个m 实际上对于m,因为m必须是 [2kC+1,2kC+k] C∈N+ 之间的数,所以还能再优化,但下面的代码已经能够
阅读全文