算法题目
算法题解
dosafdc
这个作者很懒,什么都没留下…
展开
-
字典树模板题
题目该题给出了若干个字符串,判断某个串是否另一个串的子串暴力方法,AC代码:import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ static char s[][]; public static boolean judge(int n){//判断 int i,j,m; for(i=0;i<n-1;i++){原创 2020-07-17 21:07:43 · 105 阅读 · 0 评论 -
数组写双链表
题目AC代码:package 练习;import java.util.*;import java.io.*;import java.lang.*;import java.util.*;public class Main { static Scanner scanner=new Scanner(System.in); static int l[],r[];// static int value[]; static Set<Integer>set=new HashSet<原创 2021-01-21 11:27:09 · 74 阅读 · 1 评论 -
Java实现单链表
需要实现的方法:接口:public interface MyList { /**新增一个元素**/ void add(Object element); /**删除相同元素**/ void remove(Object element); /**根据索引删除元素**/ void delete(int index); /* * 将指定位置的元素换成新元素 * index * newElement */ void update(int index,Object newEleme原创 2020-08-11 21:47:22 · 90 阅读 · 0 评论 -
codeforces1406C、Link Cut Centroids(树的重心)
题目题意:对于一棵给定的树要使得删除一条边的两个连通块不相等,此时该边的连接的两个点为树的重心思路:由于重心有两个对树的每一个节点作为一个节点找到删除一个节点,最大连通块最小的两个节点,将其中一个节点的一个连通块连接另一个连通块即可(树的重心模板)AC代码 :package 练习;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.math.原创 2021-03-29 17:55:33 · 109 阅读 · 0 评论 -
平衡二叉树(BST)——Java实现
平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。平衡二叉树大部分操作和二叉查找树类似,主要不同在于插入删除的时候平衡二叉树的平衡可能被原创 2020-10-19 21:40:58 · 306 阅读 · 0 评论 -
B - Knight Moves
题目该题是BFS的模板题,要找一个点道另一个点的最小步数,感觉这题对BFS的理解比较好,在之前看过一些BFS的视频博客,都没有特别理解,然后看了这题感觉理解加深多了,因为要找最少的,所以用bfs,不能dfs,会超时通过维护一个队列,依次找到最小的AC代码:import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ static int[] dr =原创 2020-07-10 23:49:12 · 194 阅读 · 0 评论 -
B. Fox And Two Dots(Java/dfs)
题目这题得意思就是转圈,如果不是返回上一步似的回到已经走过得地方,就输出Yes题意比较简单,主要在卡边界,还有一些地方没想到AC代码:package 练习;import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ static char[][] g; static int[][] vis; static int dx[]= {1,0,-1,原创 2020-07-11 19:40:48 · 156 阅读 · 0 评论 -
codeforcecs1093D
传送门题意:给出一个没有自环和重边的图,你可以将图中的每一个点填上1,2,3中的任何一个数字,其中一个边相邻的两个节点相加不能为偶数思路:由题意可得对于一条边上面的连着的两个数一定是一个奇数一个偶数,所以需要多图进行层序遍历,从一点出发到达距离他距离为奇数的点,和为偶数的点的数目,然后进行计算,(注意图不一定连通)AC代码:package 练习;import java.io.*;import java.lang.*;import java.math.BigInteger;import jav原创 2021-05-03 20:32:04 · 93 阅读 · 0 评论 -
试题 历届试题 危险系数
题目问题描述抗日战争时期,冀中平原的地道战曾发挥重要作用。地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。我们来定义一个危险系数DF(x,y):对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两点之间的关键点个数。本题的任务是:已知网络结构,求两站点之间的危险系数。输入格式输入数据第一行包含2个原创 2020-10-08 20:29:52 · 160 阅读 · 0 评论 -
A - Oil Deposits
题目该题是dfs的模板题,写的时候主要是在边界上面卡了半天,最后把周围加了一圈保证不出边界,才过的题意:对于给定的一个数组值找到相邻集合的个数,比较简单,主要是卡在了边界上AC代码:import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ public static int m,n; static char [][]arr; public s原创 2020-07-10 23:36:47 · 281 阅读 · 0 评论 -
CodeForces - 1282B2 B2. K for the Price of One (Hard Version)
题目有n件物品,每一件的价格为ai,你有m枚钱,你可以选择买一件,或者买k件并支付最大价值的那件的价格dp[i]是由前一件或前k件状态转移:dp[i]=min(dp[i-1]+a[i],dp[i-k]+a[i])由于排序所以所以dp[i]表示花费到第i件的最小花费AC代码:在这里插入代码片...原创 2020-07-25 17:31:13 · 209 阅读 · 0 评论 -
codeforce 1374D. Zero Remainder Array(简单DP、思维)
题目题意:给定一个长度为n 的数组,通过两个操作将数组中的每个元素都满足a[i]%m==0:操作一:将a[i]+=x&&x++;操作二:x++思路:获得数组时将所有的元素对m取余,并用m减去这个值得到在一圈中第几次可以把当前数据变为余m 等于0,然后将数组排序,然后执行下面所示代码(核心):for(int i=1;i<n;i++) { if(a[i]!=0&&a[i-1]%m==a[i]%m) { a[i] = a[i-1] + m;原创 2020-08-14 10:05:24 · 182 阅读 · 0 评论 -
F - LCS——AtCoder
题目题意:给出两个字符串,求出两个字符串的最长公共子序列思路:LCS输出公共子串(逆序)AC代码:import java.util.*;import java.math.*;public class Main { static Scanner sc=new Scanner(System.in); public static void main(String[] args) { int n=1; for(int i=0;i<n;i++) { show(); } }原创 2020-10-30 15:49:49 · 322 阅读 · 0 评论 -
石子合并(区间DP模板题目)
题目思路:状态表示:f[i][j]存从i合并到j的最小值状态转移:f[i][j]=max{f[i][k]+f[k+1][r]}(l<=k<r)+sum{a[1…r]}含义:合并i…k与k+1…r两堆,代价为sum{a[l…r]},加上之前的就是再加f[i][k]+f[k+1][r]AC代码:package 练习;import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;原创 2020-07-24 14:36:50 · 104 阅读 · 0 评论 -
最大下降矩阵(最大上升子序列)
题目思路:将每行看成一个数,然后套上最大上升子序列得到模板AC代码:import java.io.*;import java.math.*;import java.util.*;public class 练习 { static Scanner sc=new Scanner(System.in); static int a[][]; static int n,m,ans=Integer.MAX_VALUE; public static void main(String[] args) {原创 2020-11-19 11:17:24 · 165 阅读 · 0 评论 -
Research Productivity Index—牛客(概率DP)
题目题意:给出n篇论文,在这n篇论文中选取s篇使得期望最大思路:将所有论文的通过率排逆序,然后选取前s篇判断前s篇的期望,最后求最大值状态转移方程:dp[i][j]=dp[i-1][j-1]*p[i]+dp[i-1][j]*(1.0-p[i]);AC代码:package 练习;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.math原创 2021-03-25 21:09:19 · 139 阅读 · 0 评论 -
codeforce 414B. Mashmokh and ACM(DP)
题目题意:给出两个数n,k其中k为数组长度,n为数组里面的每个数的上限,求一共有多少个数组的数据全部满满足b[i+1]%b[i]==0思路:对于每个数组我们可以先确定当k=1或n=1时只有一种情况,可以将数组初始化,然后可以发现对于一个指定的dp[i][j]其中i为数组长度,j为数组最大的数,可以由dp[i][z]和dp[i-1][j]得到,其中j%z==0;所以可以得到状态转移方程:dp[i][j]=dp[i][z]+dp[i][j]AC代码:package 练习;import java.ut原创 2020-10-13 09:14:10 · 114 阅读 · 0 评论 -
codefoces 1205C. Palindromic Paths(DP)
题目题意:求从起点到(1,1)到点(n,m)的每一条路径都是一个回文串,所以保证对称位置的数字是相同的思路: 可以发现从(1,1)到(i,j)要花费i+j-2步,所以可以建立一个数组将这些数据放在里面,然后把最小的数字(需要改变的数字)加起来AC代码:package 练习;import java.io.*;import java.math.BigInteger;import java.util.*;public class Main { static Scanner sc=new Scan原创 2020-08-12 21:16:03 · 133 阅读 · 0 评论 -
A - Frog 1(线性dp)
题目题意:有一排高等不一的柱子,一个青蛙从一头跳到另一头,一次最多跳一次或两个柱子,记录高度变化的最小总和;简单的线性DP:状态转移方程:dp[i]=Math.min(dp[i-2]+Math.abs(a[i]-a[i-2]),dp[i-1]+Math.abs(a[i]-a[i-1]));初始化:dp[1]=0;dp[2]=Math.abs(a[2]-a[1]);AC代码:import java.util.*;public class Main { static Scanner sc=new原创 2020-10-21 20:19:52 · 492 阅读 · 0 评论 -
01背包模板题目
题目package 算法模板;import java.util.Scanner;public class 零一背包模板题目 { //链接:https://www.acwing.com/problem/content/2/ static int n,m,N=3500; static int[][] f=new int [N][N]; static int a[]=new int [N]; static int v[]=new int [N],w[]=new int [N]; public s原创 2020-07-20 19:41:13 · 141 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER!(01背包)
题目思路:将求最大的录取率转化为最小的不录取的概率,然后就是01背包AC代码:import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main { static int N=100010; static int a[]=new int [N]; static double b[]=new double [N], f[]=new double [N];原创 2020-07-22 21:27:55 · 103 阅读 · 0 评论 -
ACwing 1371. 货币系统(DP)
题目状态表示:a[i][j]:表示前i种货币组成j的种类数,a[n][m]即为答案状态转移方程:a[i][j]=sum(a[i-1][j-k*w[i])(k=0,1,2…k)AC代码:import java.util.*;import java.io.*;import java.lang.*;import java.util.*;public class Main { static Scanner scanner=new Scanner(System.in); public stat原创 2021-01-23 16:33:12 · 117 阅读 · 0 评论 -
完全背包模板
题目AC代码和理解:package 算法模板;import java.util.*;/* * f[i]表示总体积是i的情况下,最大价值是多少 * result = max{f[0.....m]} * for(int i=0;i<n;i++){ * for(int j=v[i];j<=m;j++){ * f[j]=max(f[j],f[j-v[i]]+w[i]) * } * } * 数学归纳法: * 1、假设考虑前i-1之后,所有的f[i]都是正确的 *原创 2020-07-20 22:44:37 · 228 阅读 · 0 评论 -
codeforce1420C(DP)
题目题意:给出一个数组,取出若干数使得取出来的数按照相邻两数相加,接着变为相减,使得最后的结果最大思路:建立一个DP的数组,dp[i][0]记录最后一个数为负的最大值dp[i][1]记录最后一个数为正的最大值max(dp[i-1][0],dp[i-1][1]-arr[i])max(dp[i-1][1],dp[i-1][0]+arr[i],arr[i])AC代码:package 练习;import java.io.*;import java.math.*;import java.util原创 2020-09-25 18:17:34 · 163 阅读 · 0 评论 -
codeforces 1395D Boboniu Chats with Du(DP、思维)
题目题意:给出三个数:n,d,m,然后给出一个长度为n的数组,你需要做的是将这个数组重新定义一个顺序使得所有可以加在一起的数字的和最大(当数组里面的一个数大于m,接下来的d个数字不能加进来)AC代码:package 练习;import java.io.*;import java.math.BigInteger;import java.util.*;public class Main { static Scanner sc=new Scanner(System.in); static lon原创 2020-08-13 15:26:48 · 183 阅读 · 0 评论 -
codeforces 1373D(思维,dp)
题目题意:通过反转一次字符串得到最大的偶数位和思路:选择一个偶数段,例如:1,2,3,4,5,6,通过翻转1,2得到2,1偶数和得到改变,如果反转1,2,3原来的偶数位的和不变,由于只能改变一次所以一次反转两个数字,应为反转多个效果一样,都只能改变一个,但是需要一个偶数同时比较前后两个奇数所以需要循环两次AC代码:package 练习;import java.io.*;import java.math.BigInteger;import java.util.*;public class M原创 2020-08-11 09:27:42 · 189 阅读 · 0 评论 -
POJ1579_Function Run Fun(记忆化搜索)
看着题目提示的时间会很长的时候就想到了记忆化搜索,但是一直不知道该咋写,看了大神的发现直接开一个三维的数组所有的情况的结果都不会超过20,所以有一下代码;package 练习;import java.util.*;import java.io.*;import java.lang.*;import java.util.*;public class Main { static Scanner scanner=new Scanner(System.in); static int a[][][].原创 2021-01-20 21:03:23 · 111 阅读 · 0 评论 -
1344: [蓝桥杯2017决赛]区间移位(二分)
题目题意:用已有的区间去覆盖[1,10000]这个大区间,求移动步数中移动最大的距离AC代码(感觉应该有过不去的样例,但是给的样例都过了):package 蓝桥杯2017;import java.util.*;public class 区间移位 { static Scanner sc=new Scanner(System.in); static int n; static List<Node>a=new ArrayList<>(); public static v原创 2020-11-09 20:51:38 · 260 阅读 · 0 评论 -
最长上升子序列(dp,二分,nlogn)
例如:对于{2,4,5,8,5,9}可以找到最长上升子串为{2,4,5,8,9}1、首先先看看n^2的算法(dp:感觉就是一个暴力):设计状态:记f(x)为以a[x]结尾的LIS长度,那么LIS=max{f[x]}如何推导f(x):考虑下标小于x的所有数,如果a[x]>a[p],那么f(x)=f§+1状态转移方程:f(x)=max{f§}+1(p<x,a[p]<a[x])时间复杂度:n^2代码:import java.util.*;public class App {原创 2020-10-12 22:04:48 · 175 阅读 · 0 评论 -
codeforces 1366B(区间合并、双指针)
题目题意:通过交换a[k]可以获得的1可以在的最多位置得个数AC代码:package 练习;import java.io.*;import java.math.BigInteger;import java.util.*;public class Main { static Scanner sc=new Scanner(System.in); public static void main(String[] args) { //show(); for(int t=sc.nextInt原创 2020-08-12 11:55:57 · 151 阅读 · 0 评论 -
数的范围(二分)
题目:https://www.acwing.com/problem/content/791/题意:根据给出的一个数找到一个区间,该区间的数全为给出的数思路:根据两个不同的二分模板:一个找到左边界,一个找到有边界使得确定最后的区间AC代码:package 算法模板;import java.util.Scanner;public class 二分模板_AWing { static Scanner scanner=new Scanner(System.in); public static v原创 2021-01-13 20:48:34 · 118 阅读 · 0 评论 -
codeforces 760B B. Frodo and pillows(二分)
题目题意:给出n个人,m个东西,要求第k个人获得的最多,且相邻的两个相差小于2;思路:二分答案,每次找到一个mid,通过判断最大值和最小的结果,判断mid是否符合条件,最大为nmid 最小(1+mid)/2(n-k) +(1+mid)/2*(k)-kAC代码:package 练习;import java.io.*;import java.math.BigInteger;import java.util.*;public class Main { static Scanner sc=new原创 2020-08-10 15:00:37 · 217 阅读 · 0 评论 -
B. Heaters
题目题意:一条直线上有n个地方,每个火的范围是r为半径,判断最少需要几个火思路:不断更新左边界,并判断是否超过有边界AC代码:package 练习;import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ static int a[]; public static void main(String[] args) { Scanner sc原创 2020-07-14 15:46:40 · 205 阅读 · 0 评论 -
codeforces 1426C.二进制搜索
题目题意:给出三个数:数组的长度:n、要查找的数:x、要查找数的下标:p自己模拟题目给出的二分,找到给出的数,求出可以得到该数的所有序列的数量思路:本题的思路主要在模拟二分上,首先将给出的n个数分为大于要查找的数的个数n-x个和小于要查找数x-1个,接着开始模拟二分,对于每一个mid,如果大于p需要填上一个大于x的数,这又(x-1)种情况(每次都要对小于的减一),反之则反之,而剩下的(n+m)个数就是没用的数,直接全排列即可AC代码:import java.util.*;import java原创 2020-10-25 16:31:47 · 159 阅读 · 0 评论 -
洛谷 P2678 跳石头(二分答案)
题目题意:就是给出一段距离,中间有n个石头,每次你都减少一块石头使得最小的距离减少,求减少m个石头后的最小距离思路:数据比较大,暴力过不去,但是我们可以知道是在给定距离内去找到一个合法的最大的数,如果暴力需要遍历每一个,所以可以用二分每次取中间达到最大AC代码:在这里插入代码片...原创 2020-09-06 14:48:17 · 208 阅读 · 0 评论 -
E - Queries about less or equal elements CodeForces - 600B
题目这题就是一个简单的二分,比较水,想着之前的没写过二分的模板,这个比较简单,当模板比较合适AC代码:import java.io.*;import java.math.*;import java.math.BigInteger;import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc=new Scanner(System.in); int a=sc.nextI原创 2020-07-15 22:08:03 · 123 阅读 · 0 评论 -
力扣周赛—5704. 好子数组的最大分数(双指针)
题目题意:给出一个数组和一个数值k,对于所有min(ai…aj)*(j-i+1)返回一个最大值。思路:开始想着直接递归算,很荣幸的超时了,用双指针不断的扩大区间,判断是否小于最小值ak,判断a[l]和a[r]的最大值接着进行循环AC代码:class Solution { public static int maximumScore(int[] nums, int k) { int l=k,r=k,n=nums.length,ans=0; while(true) { while(原创 2021-03-15 10:19:47 · 197 阅读 · 0 评论 -
codeforces 985D(二分+前缀和)
传送门题意:Alice每天可以制造Ai体积的雪,但是由于每天温度为Ti,一堆雪在一天会融化Ti体积,直到这对雪全部融化后才会停止思路:首先将所有的体积进行前缀和加起来得到一个温度的前缀和数组,然后对于每一个Ai进行二分查找,找到Ai最后融化为0的地方,并用一个差分数组记录在哪些地方是可以融化Ti(每一个Ai对应的Ti),用一个sum数组记录所有在i处融化但是融化体积不是Ti的和,最后将差分数组进行前缀和计算出sum[i]+d[i]*b[i]即为结果。import java.io.*;im原创 2021-11-18 08:57:42 · 262 阅读 · 0 评论 -
codeforce1420B(按位模、二分)
题目题意:给定一个数组,对于j>i存在arr[i]&arr[j]>arr[i]^arr[j],求共有多少组思路:对于一个数符合要求的数只有这个数存在于2的n次方到2的n+1次方之前(n为它除2向下取整知道等于1)由于数据较大所以直接写肯定超时,所以需要优化(二分)代码:import java.io.*;import java.math.*;import java.util.*;public class Main { static Scanner sc=new Scanne原创 2020-09-25 17:28:21 · 186 阅读 · 0 评论 -
数的三次方根(浮点二分)
题目思路:二分找到某个数的三次方等于xAc代码:#include <iostream>using namespace std;int main(){ double x; cin>>x; double l=-10000,r=10000; while(r-l>1e-8){ double mid=(l+r)/2; if(mid*mid*mid>=x)r=mid; else l=mid; } printf("%lf\n",l);原创 2021-01-13 21:32:30 · 159 阅读 · 0 评论