
算法
文章平均质量分 54
RT_wqt
这个作者很懒,什么都没留下…
展开
-
leetcode剑指offer36
二叉搜索树与双向链表 解题思路: 二叉搜索树的中序遍历的节点顺序就是有序的。可以通过双指针法去记录前驱节点和后继节点。 class Solution { public: Node* treeToDoublyList(Node* root) { if(root==NULL) return NULL; dfs(root); head->left=pre; pre->right=head; return head;原创 2021-06-01 10:11:25 · 158 阅读 · 0 评论 -
第15届浙江省大学生程序设计竞赛D题
题意:给你一个由’(‘和’)‘组成的序列,第k个位置上的括号能与第k+1个位置上的括号交换的条件是s[k]=’(‘且s[k+1]=’)’。如果能交换,那么分数就加上a[k]*a[k+1],权值随着括号的交换而交换。问你能达到的最大的分数是多少。 思路:先计算出每一个括号移位到第j个位置所能得到的分数。(mat[i][j]表示第i个括号移到第j个位置可以加的分数)。之后就是在mat二维数组的每一维上选一个数,限制条件是当前层选的数的位置要>=上一层选的数的位置。dp[i][j]表示第i层选第j及之前的数原创 2020-10-01 22:01:45 · 3610 阅读 · 1 评论 -
2020杭电多校第10场1004
题意:给你一个长度为n-1的序列,若a[i]=1,则b[i]>b[i+1];若a[i]=0,则b[i]<b[i+1]。问你根据这个给定的a序列能构造成多少满足条件的关于b的全排列。 思路:dp[i][j]表示放了i个数,第i个位置放j的情况总数。假如现在放到第i个位置,想要在第i个位置放置j。若a[i]=0,那么dp[i][j]=dp[i-1][1]+dp[i-1][2]+…+dp[i][j-1]。这里有一个问题,那就是会想到重复放置数的情况。比如,现在要放3,而前面已经放过。前一个集合为{1,原创 2020-09-04 14:07:28 · 193 阅读 · 0 评论 -
global round 10 D
题意:每个人可以攻击他左边的或右边的人,n的右边是1,1的左边是n。如果一个人没有被两边的任何一个攻击,或同时被两边攻击,他可以任选一个人攻击,如果只被一边的人攻击,那么他只能还击。让你求改几次能满足上述条件。 思路:如果只有一个方向RRRRR…或LLLLL…那么只需要改n/3+(n%3>0)个,如果是两个方向都有 ...原创 2020-08-24 11:26:22 · 365 阅读 · 0 评论 -
codeforces educational round 93 D
题意:给你三个序列,让你取数对,这两个数在不同的序列里。每个数只能取一次,让你求所有数对的两个数的乘积总和最大是多少。 思路:先将三个数组进行从小到大排序,之后dfs 3种取法,每个递归层进行递推。dp[i][j][k]表示用了i个R,j个G,k个B能得到的最大乘积之和。 var readline=require('readline'); var rl=readline.createInterface({ input:process.stdin, output:process.stdout原创 2020-08-15 14:50:44 · 176 阅读 · 0 评论 -
codeforces educational round 63 C
题意:给你一个序列,其中的元素为大小范围0-9,让你求区间之和等于区间长度的情况个数。 思路:假设区间i~j满足条件,则有qz[i]-qz[j-1]=i-j+1,可以转换为qz[i]-i=qz[j-1]-(j-1)。对于每一个下标i,它前面有多少个下标j满足qz[i]-i=qz[j]-j。还要去加上每个下标的前缀和本来就等于区间长度的情况。 var readline=require('readline'); var rl=readline.createInterface({ input:proces原创 2020-08-15 01:28:30 · 97 阅读 · 0 评论 -
codeforces round 664 C
题意:给你两个序列a和b,让你计算一个c序列,c[i]=a[i]&b[j](同一个b中的元素可以被使用多次),让你求c[1] | c[2] | … | c[n]最小的那个值。 思路:暴力枚举c的值(0-2^9)。vis[i][j]表示前i个数能构建出j。刷表刷出所有情况即可。 var readline=require("readline"); var rl=readline.createInterface({ input:process.stdin, output:process.s原创 2020-08-14 17:58:02 · 104 阅读 · 0 评论 -
2020杭电多校第六场1006
题意:给你n个点,每个点被标记为0或者1,边权与给定的输入顺序有关。输入的第i条边的权值为。求所有0和1的点之间的最短路径之和。 思路:,构建一个最小生成树,求最小生成树之内的所有0和1的点最短路径之和即可。只需要算每条边两侧的01对即可。显然枚举每条边爆搜会超时,通过树形dp可以压缩复杂度。dp[i][j]表示第i个点及之后的标记为j的点有几个。那么这条边的两侧的01对就可以计算出来,比如某个点u,它之后的标记为1的点有x个,那么,在这条边的另一侧,标记为0的点有(总的标记为0的点数-u及之后标记为0的点原创 2020-08-07 13:42:38 · 166 阅读 · 0 评论 -
2020杭电多校第四场1004
题意:给你n个城市和m条边,并将这n个城市分为三类—L,R,M,其中在L类的城市必须用左手;在R类的城市必须用右手;在M类的城市不限制左右手。换一次手需要x的时间。问从起点到终点的最短路径。 思路:拆点的思想,将每个城市划分为L,R两类点,若边的两个端点类型一个为L,一个为R,需在原边权基础上加x,若为同类型则不需要加x。另外,再设一个源点和汇点,将源点和起点相连,边权为0.将汇点和终点相连,边权为0。连线规则:城市为M,则需要连它的L和R。而对于L,R只需要连对应的类型即可。连玩跑一下最短路就可。 #in原创 2020-08-02 17:01:08 · 156 阅读 · 0 评论 -
吉林大学ACM集训队选拔赛(重现赛)B题
题意:一个序列找出一个集合,和最大且能被5整除。 思路:dp选和不选的问题。 opt[i][j]表示前i项中选任意个,sum%5=j的最大值。 1.不选第i个数,当前余j的最优解就是前面一个状态余j的最优解。 2.选第i个数,那么要求当前余j的最优解,必须要使前一个状态的余x满足 (a[i]+opt[i-1][x])%5==j ...原创 2020-06-18 18:33:49 · 210 阅读 · 0 评论 -
厦门大学“网宿杯“17届程序设计竞赛决赛(同步赛)
F题 题意:让你构造出一个长度为n的序列满足其中任意一个子集的和不为n。 结论:1.如果n为奇数则答案为1,1,…1,n+1和2,2,2,2 2.如果n为偶数则答案为1,1,…1,n+1原创 2020-05-31 09:51:14 · 249 阅读 · 0 评论 -
A*算法学习笔记
A*算法基本原理 A-star算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 F[i]=G[i]+H[i]; 这是A*算法的核心表达式,即每次取出当前代价+未来估价最小的状态。其中估算值H[i]<=未来实际代价。 若估算值大于未来实际代价不能保证A*算法的正确性。(此处看了<<算法竞赛进阶...原创 2020-02-08 16:21:32 · 503 阅读 · 0 评论