- 博客(34)
- 收藏
- 关注
原创 CodeForces 740 div 2(A-E)
codeforces 740div2A. Simply Strange Sort题目思路:给一个数组aaa,下标为奇数时,满足ai>ai+1a_i>a_{i+1}ai>ai+1时,更改ai和ai+1a_i和a_{i+1}ai和ai+1的位置,ans++ans++ans++,并对所有下标为奇数的序列重复这种操作。下标为偶数时也是同样操作。操作顺序起点从111到nnn,直到整个序列是一个有序序列就停止,输出ansansans的值(如果序列已经有序则为000)。这道题第一次做有好多
2021-09-14 23:12:39
290
原创 CF#722 (Div2) It‘s a bird! No, it‘s a plane! No, it‘s AaParsa! 详细题解
题目大意:给定一张有向图。每条边可以有这样的操作:如果一条边a->b=c,即从a指向b,边权为c。那么有a->(b+1)%n=c+1,即可以从a指向(b+1)%n=c+1。即输入的图只是初始状态,每条边每间隔1s都会指向不同的终点。要求在这张图上任意两点的最短距离。思路:此题唯一不容易处理的是“等待”这个操作,那么先考虑不等待的情况,If(Graph[i][j]){ //I与j相连 To=d[i]+j //即走到这条边时,终点的位置 d[to]=min(d[to],d[i]+Gr
2021-06-12 16:47:17
230
原创 2021-SZTU第一届acm校赛总结
关于题目:我们队上来找到签到题,一个上去签,我和另外一个继续看题,我从后往前,他从前往后。后边的题目普遍是中文,难度也更高。然后他们两个就讨论一题签一题,干掉四题。我看了一道区间操作相关的题目,最近刚好学了线段树,感觉可以搞一搞。然而我上来就排除了线段树的做法,转而用一种较为奇特的差分数组和前缀和数组来模拟。(后来教练说这题是线段树。。。。不过他队友用奇奇怪怪的思路解决了)。然后我就在这道题上卡了很久,队友一直在写前几题,似乎比较顺利,最后解决了几个bug之后队友让我去看看别的题,我看bug一时半会找不出
2021-05-16 18:58:48
393
1
原创 Uva 1220 Party at Hali-Bula(最大独立子集问题)
题目大意:给一个图,要求相邻节点不能同时选择,求最多能选出多少个节点,其次,判断最大节点数的情况是否唯一。思路:即求最大独立子集。在此基础上再判断情况唯一就行。反思:起初写了一个暴力判断情况唯一的,再一个节点下枚举判断每一个子节点是否情况唯一。这个代码再poj和hdoj上都过了,再uva上超时了,索性照着紫书上的方法再开一个vis数组再做一次dp。紫书开了一个二维数组a[i][0/1]来表示i节点选或不选得到的结果。如果不开二维数组的话,也可以开两个数组s[i],gs[i],分别记录子节点的答案和
2021-05-11 19:08:46
207
原创 HDU 2102 A计划(BFS+细节维护)
一道很裸的BFS,看时间复杂度看可以用DFS+剪枝就很神奇。第一次做的时候维护了很多量,比如时间在此题中是一个重要的量,但是不用时刻维护,只需要维护走到当前位置需要多少天,最后找到P是多少天(如果能的话),比较找到P的天数和给定的天数即可。还有一个问题就是图的构建,开始我将N开大两倍,发现这样做有很严重的边界判断问题,容易出现bug还使得代码量增加,直接再开一维能够避免上述情况。此题还有一个教训是hdu上有个误导性样例,除非万不得已不要看discuss,简直有毒。总之此题走出了很多坑,是到不错的题目,B
2021-05-08 00:25:43
227
1
原创 Codeforces Round #710 (Div. 3)【全题解】
A. Strange TableA题一道关于横纵坐标的转化问题。先由给出的数推出在第一个矩形的横纵坐标,然后根据这个坐标计算出在第二个矩形里的数。代码:#include<cstdio>#include<iostream>using namespace std;int main(){ int t; scanf("%d",&t); while(t--){ long long int n,m,x; cin>
2021-05-05 16:36:17
200
原创 CF Round #713 (Div. 3)【A-G】全题解
A题:直接数次数。B题:模拟一下,不同行列的放在一起看,相同行列的放在一下看,注意细节问题。#include<cstdio>#include<cstring>using namespace std;char a[404][404];struct point{ int x,y;};int main(){ //freopen("1.txt","w",stdout); int t; scanf("%d",&t);
2021-05-01 00:21:02
146
1
原创 CF1516B AGAGA XOOORRR【异或运算+区间操作+暴力枚举】
题目大意:给一个序列,序列中每两个相邻的元素可以做异或运算,然后这两个元素消失,得到的结果替换他们的位置。如果最后序列中所有元素都相等并且序列长度至少为2,则YES否则NO。思路:一定要看清题目,一是相邻,二是序列长度至少为2,如果序列中有4个元素相等,可以转化为2个元素相等,如果有三个元素相等,则无法用两个元素相等的方法来判断,所以就判断2个元素相等和3个元素相等的情况就行了。用区间的方式记录按位异或的结果。最后判断输出即可。时间复杂度为O(N^2),不是最好的,其实还可以用O(N)的方法来做。但第
2021-04-27 21:57:47
371
原创 HDU-1560 DNA sequence【构造答案+IDA*剪枝】
题目大意:给N个字符串,求一个最短序列能否将N个字符串包含。输出最短序列的长度。思路:可以构造一个最短序列,然后判断能否将所有序列包含进去。然后用IDA*剪枝(这到没错)。构造的过程并不复杂,因为只涉及4个碱基。再有就是回溯的问题,这里需要对每个字符串设置一个指针,用于判断包含关系。最后的包含关系肯定是所有字符串的指针都走到了最后一个元素。可以用数组来存每个字符串当前的指针位置,但是每个状态有不一样,这里可以用一个数组参数传递到下一个状态上,这样就避免了回溯麻烦的问题产生。反思:这个构造确实巧妙,
2021-04-24 22:26:03
269
原创 POJ-2488 A Knight‘s Journe【深搜+字典序输出】
题目大意:输入N,M。代表一个N*M棋盘,N为1–N的数字,M为从A开始数M个字母。问有一个骑兵(象棋里的马),能否走完棋盘上每一个点且每个点只走一次。如果可以:答案是输出走过的坐标,要按照字典序最小输出。比如第一个点是(1,A)。如果不行:输出impossible思路:此题用基本思路深搜,但是麻烦的地方在于按照字典序最小输出,这要求八个方向的搜索是有先后顺序的。所以框架就是先递归路径,看能不能走完棋盘上的点。如果可以然后再进行一次递归输出答案。代码如下:#include<cstdio>
2021-04-24 21:54:01
112
原创 POJ-2248 Addition Chains【暴力IDA* 16ms】
题目大意:给一个数N,初始集合{1},集合内元素可以相加(与其他元素或与本身相加),在最短步数求的答案的情况下输出集合内所有元素。思路:看完题目觉得是power calculus的简化版本,看时间限制为1s,也比那个题目少。思路是完全一致的。暴力IDA*。不过初始deep可以用对N求log得到最小deep,然后不断判断看是否需要deep+1。代码:#include<cstdio>#include<cmath>#include<algorithm>using
2021-04-22 11:09:03
116
原创 Power Calculus【经典IDA*】
题目大意:给一个数N,代表x的N次幂,起初集合内只有元素x,集合内任意元素做乘法(可以自乘可以和其它元素相乘)得到一个新的元素并放入集合内。要求最少做多少次乘法和以得到N次幂。思路:最初做题时用贪心的做法发现有些答案不对,转而用暴力IDA的做法,不过还是夹杂着贪心的思路,如果当前的幂小于给定幂,就只做乘法,只有当前幂大于给定幂时才做除法。不过这种方法对与某些个例来说是算不出正确答案的。所以只能是不管当前幂大于还是小于给定幂,乘除法都要做,虽然用了IDA,但在数据量为1000时还是比较慢,大概3~4s
2021-04-21 19:44:35
301
原创 Uva 1343 The Rotation game (IDA*题解 耗时60ms)
题目大意The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). Theblocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind.Initially, the blocks are placed on the board randomly. Your task is to
2021-04-16 17:33:12
140
原创 Uva 11584 Partitioning by Palindromes
题目大意:输入n个字符串,对于每个字符串计算其中能够划分成的最小回文串个数。思路:做法很像背包。如果用dp写题铭记当前状态一定由之前状态推得。最后的状态往往设置成答案(有时需要转化一下,大部分情况下把最后要求的答案设置成状态方程)。此题就是设置成dp[i]为直到i点,所能构成的最小回文串个数。转移方程为:dp[i]=min(dp[i-j]+1,dp[i])表示的是如果j+1–i为回文串的话,更新答案。代码:#include<cstdio>#include<cstring>
2021-04-01 13:00:41
168
原创 Uva 11400 Lighting System Design 题解
题目大意:给定N组灯具,每组灯具包含V(灯的电压),P(电源花费),C(灯的单价),N(所需要的灯的数量)。规定低电压的灯可以换成高电压的灯,同时电源也要换。且一个电源可供无数灯运作。要求部署N组灯具的最小花费。思路:首先按照电压V从小到大进行排序,这样才能确定递推顺序。其次是状态转移,这里用到的是区间dp的套路即区间【L,R】由【L,i】【i+1,R】转移而来。我想过这个问题,就是能不能连续选择一段区间的问题,最初是没有证明出来的,所以也就没用这种方法。比如1,2,3。为什么不能选1,3为一组,2为
2021-03-30 16:58:38
105
原创 Uva11134 Fabled Rooks矩阵分解为区间
题目大意:给一个N*N的棋盘,和N个矩形的左上角和右下角坐标,每个车只能放在矩阵中,求是否存在一种放法使得每个车都不会互相攻击,若没有则输出IMPOSSIBLE,N<=5000。思路:先将二维问题转化为一维问题,将矩阵问题分解为区间问题就要把矩阵的长看作一个横向的区间,矩阵的宽看作竖向区间。转化后就是选点,每个矩阵已经被转化成2个区间了(横着和竖着的),接下来就是选点。因为在横向区间选点不会影响竖向区间选点。那么该如何选点?与紫书上的区间选点问题不同,区间选点是要求选一个点,使其包含这个点的区间
2021-03-22 13:29:34
137
原创 第十八届浙大城市学院程序设计竞赛 D-LCA On N-ary Tree
题目大意:The N-ary tree is a tree that each node has exactly nn_{}n child nodes.You are given an N-ary tree with infinite nodes, each node is numbered from 11_{}1 to infinity according to the level order(from left to right, level by level).Given the numbe
2021-03-22 13:25:55
207
原创 第十八届浙大城市学院程序设计竞赛 F-Palindrome
题目大意:You are given a string s of n lowercase letters.You have to delete exactly two letters from s , determine whether the string can become a palindrome after the change.Definition of palindrome: If a string s of n lowercase letters is a palindrom
2021-03-22 13:24:11
210
原创 最大连续子序列和
最大连续子序列和:一维子序列和:dp[i]=max(dp[i-1]+a[i],a[i]),i表示第几个点。因为要连续的,所以要么与之前的连续数列相连接即dp[i-1]+a[i],要么就不连,起点更新为这个点。最大连续子序列和为ans,实时更新即可。二维子矩阵和:给一张二维表格求最大子矩阵和,其思想与最大连续子序列和一致。可设三个维度dp[i][j][k],i表示第几行,j表示起始列,k表示终止列。转移方程为dp[i][j][k]=max{ dp[i-1][j][k]+SUM(j,k),SUM(j,k
2021-03-16 23:08:03
172
原创 P1006 [NOIP2008 提高组] 传纸条 题解
题目大意:给定一张n*n的图,要求从左上角走到右下角,再从右下角走到左上角。每个点都有一个值,要求最大路径值,并且来回的路不能重复的点。思路:朴素做法是四维数组,dp[1][2][3][4]前两维是第一个点的坐标后两维是第二个点的坐标。反思:有个疑问,为什么最后的输出顺序是dp[n][m-1][n-1][m]而不能是dp[n-1][m][n][m-1]。代码如下:#include<cstdio>#include<algorithm>using namespace
2021-03-16 23:04:42
246
原创 POJ-1088 滑雪之拓扑序dp
题目大意:给定一张n*n的图,从一个点可以向上下左右走,要求一条最长的路,输出其长度。思路:因为不定起点,并且有优先级,可以构建有向图,按照拓扑序跑DAG上最长路。如果用这种方式不能直接构建临接矩阵,洛谷上是ac的,但是在poj上MLE,试了试临接表就可以过了。并且需要把坐标转化成点以降低空间复杂度。还有别的方法是记忆话搜索。时间和空间都是碾压拓扑序+dp的。但是我首先想到的是上面的一种,一是出于锻炼dp的缘故,二是认为记忆话有爆栈或者时间效率不高,就自动的忽略了这一方面,但其实记忆话搜索还是比较好
2021-03-16 23:02:15
133
原创 FZU-1914 Funny Positive Sequence
题目大意:There are n integers a1,a2,…,an-1,an in the sequence A, the sum of these n integers is larger than zero. There are n integers b1,b2,…,bn-1,bn in the sequence B, B is the generating sequence of A and bi = a1+a2,+…+ai (1≤i≤n). If the elements of B are
2021-03-16 22:57:39
81
原创 POJ-1050 To the MAX题解
题目大意:给定一个矩阵,要求矩阵中最大子矩阵和。N<=100如输入:40 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2输出:15思路:法一:这题是到数据范围不是很严谨的一道题,虽说N<=100,但是N^4仍然可以过。复习一下二维前缀和的知识dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];若要求左上角为(i,j)右下角为(x,y)的矩形和则为:dp[x][y]-dp[x][j-1]-dp[i-1][y]+dp
2021-03-16 22:55:08
319
原创 POJ - 1018 Communication System题解
题目大意:给定N组通信设备,并在每组之后输入多个相关的零件制造商给出的可建造带宽数和相应价格。每组只能选择一个零件制造商,并规定B为选出来的N个制造商中宽带最小的数值。SumP是N个选出来的制造商价格之和。要求最终B/SumP的最大值,并且保留三位小数输出。思路:首先决策比较容易分析(通常来讲),比如此题中,每组只能选一个,每组的制造商只有选或着不选两种状态。由于动态规划需要包含所有状态。设状态式为dp[i][b]表示在前i组零件中以B为最小值时的SumP。dp[i][k]=min(dp[i][k]
2021-03-16 22:52:50
167
原创 DAG模型
概念:DAG即有向无环图。因为其有向性和拓扑序很相似,都是在定义优先级,其实拓扑序也是无环图,这好像也是他们的共同点。由此缘故很多DAG+dp问题可以转化为拓扑序+dp问题。比如紫书上的嵌套矩形问题,巴比伦塔问题。但是比如紫书上的硬币问题,就必须用DAG求最短最长路。可以说DAG只是一种特殊的图,并没有起点,是去中心化的。构建:需要显化隐式图,并且构建有向边,这一步是将问题图论化,并将问题的解转化为DAG上求最短最长路问题。资料有向无环图是描述一项工程或系统的进行过程的有效工具。除最简单的情况之
2021-03-08 15:56:32
1437
原创 Unorder_map和Hash
引言:同一个题目:上边是unorder_map,下边是手写hash表。速度上unorder_map比hash慢了将近10倍,但代码量是hash的一半。在这个题目中,还有种二分查找的做法时间复杂度是O(N2logN),Hash的效率是O(N2),可以看出unorder_map的速度比二分稍快一点。但时间效率上Hash的效率是最高的。这个图是二分查找做法Hash:哈希表的作用是查找某个值是否存在,可以类比桶排序。哈希表的构建需要两个数组和一个常数分别是HashMask[Hashsize],Has
2021-03-08 15:51:26
265
原创 Uva 10129 Play on Words
题目大意对于每组数据,给定N个单词(字母均为小写字母),任意两个单词a,b。如果a的末尾与b的开头字母一致,则a与b可以相(顶针)。你的任务判断每组N个单词是否可以连成一个串。思路开一个二维数组,alpha[27][2],比如字母a作为开头则alpha[1][0]+=1;然后根据欧拉回路进行判断。欧拉路:除起点,终点之外,其余点的度一定是偶数(除了起点和终点,其余点一定有出度等于入度,而起点出度大于入读,终点入读大于出度)。即存在一条边,从起点到终点,每个点经过一次。欧拉回路是在欧拉路的基础上终点还
2021-03-08 15:46:28
93
原创 Uva1152 4 Values whose Sum is 0
题目大意输入一个正整数N,接下来的N行每行输入4个数,从左到右分别是a,b,c,d。要求在N*4的表中满足a+b+c+d=0条件的个数。N<=4000。思路需要转换一下思维,因为直接暴力遍历时N^4,可以分别遍历a+b和c+d的值,并且之存a+b的值,都存的话没必要而且浪费空间。之后算c+d时通过再来查找有多少a+b的值满足条件。二分查找法:首先将a+b的值sort一下,然后对于每一个c+d(之后算出来的),通过二分查找(也可以采用upper_bound和lower_bound)来确定满足
2021-03-08 15:42:14
141
原创 Uva 11853 Paintball
题目大意给定一张1000*1000的图,要求从左边走到右边,无论起点还是终点都要尽可能的向上。再给定N组Ball,给出Ball的坐标(x,y)和其半径r,要求在从左往右走的过程不能进入Ball的范围中。答案要求输出起点和终点坐标,如果无法从左走向右那么输出IMPOSSIBL。思路看起来是个比较平凡的BFS求最短路问题,但仔细分析后发现如果直接BFS+边走边判的时间复杂的是10^9,是必然超时的。所以不能直接套BFS。既然正着思考(类似模拟–言听计从)行不通,不妨试试逆向思考。从障碍物Ball出
2021-03-08 13:35:37
160
原创 Uva 437 The Tower of Babylon
题目大意你有N种石头,给定石头的长宽高,每种石头有无限块,石头的叠放顺序是上一个石头的长宽比下一个石头的长宽要严格大于,要求叠起来的石头高度最大值。1<=n<=30。思路方法一:拓扑序+dp。动规方程dp[i]=max(dp[i],dp[j]+stone[i]),dp方向是拓扑序。这题之所以能用拓扑序+dp是因为每种石头只能放一次,虽说有无限块,但是限于叠放顺序的原则是不能多放的。而输入的石头可以有三种放法,因此石头种数时N*3,然后构建图并且以拓扑序进行dp。方法二:DAG+DP。这种
2021-03-08 13:28:52
97
原创 Uva 1605 Building for UN
题目大意在联合国大楼里,你需要进行给每个国家划分办公区域,大楼可以有很多层,在每一层中,一个国家的办公区域必须是个连通块并且不能被其他国家分隔开。不同层之间也可以进行国家间交流,方法是打开天花板或地板(额。。。)你的任务是设计联合国大楼里的各国家办公区域,一个国家可以在不同层都具有办公区域,并且要求任意两个国家都可以互相交流,区域一定是矩形。思路神奇的构造题。如下图所示只构造两层。这种题总是构造出来就明白怎么做了,但自己想就想不出来。(可能是太懒了,不想思考)。反思构造题目还是需要自己花时间想
2021-03-08 13:25:31
156
原创 Uva 1025 A Spy in the Metro
题目大意有两段轨道,一条向左,一条向右,一人在最左端乘火车,准备到右端N点。火车每经过一段距离会到达一个站台。在此题中,若还没到达下一站台,则需在原来站台等待直到有火车经过(方向随意)。要求等待时间最短的情况下在规定时间内到达N点,数据范围较小。思路首先对于每个站台有3种抉择,分别是等待(在火车未到达下一站台的时候)然后时间加1,跳到下一轨道(如果能),跳到上一轨道(如果能)。如果分析出来这三个抉择则能初步判断是动态规划。而需要维护的状态是T时间,M站台,dp[T][M]的意义是在时间点为T时,在M
2021-03-08 13:21:11
115
原创 HDU-5705 Clock
题目大意给定一个时间T,一个度数D,求在T时间之后,时针和分针的角度恰为D,求此时间。思路尽量不要算除法,会有精度问题(某些二分除外),将除法转化成乘法问题。每120/11 秒对应 时分针相差一度。然后每次增加120秒,同时将此时刻秒数*11(避免除法导致精度误差),进而继续判断如果此时的度数和目标度数是否相等并且当前时间T和上次时间t是否满足T>t,如果都满足条件,则退出循环。输出答案。注意在输出答案的时候要令答案除11,已得到正确答案。技巧fabs()是求浮点数绝对值,abs()是求整数
2021-03-08 13:17:29
104
原创 Uva 120 Stacks of Flapjacks
题目大意给定一个时间T,一个度数D,求在T时间之后,时针和分针的角度恰为D,求此时间。思路尽量不要算除法,会有精度问题(某些二分除外),将除法转化成乘法问题。每120/11 秒对应 时分针相差一度。然后每次增加120秒,同时将此时刻秒数*11(避免除法导致精度误差),进而继续判断如果此时的度数和目标度数是否相等并且当前时间T和上次时间t是否满足T>t,如果都满足条件,则退出循环。输出答案。注意在输出答案的时候要令答案除11,已得到正确答案。零食fabs()是求浮点数绝对值,abs()是求整数
2021-03-08 13:07:28
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人