算法
Tizzii
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
KMP 深入理解next数组
一、引言KMP又称模式匹配算法,能够在线性时间内判定字符串A[1~N]是是否为B[1 ~ M]的子串,并求出A在B中各次出现的位置。二、基本含义next数组:next[i] 代表A中以i结尾的非前缀子串(非前缀子串的意思就是不能和A完全相等的后缀子串) 与 A的前缀能够匹配的最大长度。当不存在这样的前缀串时,显然next[i] = 0, 故next[1] = 0 (因为第一个字符前面...原创 2020-03-05 21:50:49 · 2398 阅读 · 2 评论 -
计蒜客--棋子等级
一、内容二、思路由于输入的坐标(x,y)是按照先按Y排序,再按X排序,所以Y大的一定是后面输入,在Y(相同高度的情况下),x小的一定先输入。所以我们维护1-n区间的棋子数,判断某个棋子(X,Y)它左下方棋子的数量就等于1-x这个区间所保存的值,然后进行树状数组的更新。将当前的棋子更新进去,更新的点就是X点。由于x,y可能等于0,那么更新的时候就会陷入死循环,因为0的lowbit ==...原创 2019-08-25 18:52:30 · 529 阅读 · 0 评论 -
[Java] HDU-1009
一、内容FatMouse’ Trade FatMouse prepared M pounds of cat food, ready to trade with the cats guarding the warehouse containing his favorite food, JavaBean.The warehouse has N rooms. The i-th room conta...原创 2019-08-15 13:49:29 · 472 阅读 · 0 评论 -
[Java] HDU 1004
一、内容Let the Balloon Rise Contest time again! How excited it is to see balloons floating around. But to tell you a secret, the judges' favorite time is guessing the most popular problem. When the con...原创 2019-08-15 13:13:19 · 551 阅读 · 0 评论 -
[Java] HDU-1279
一、内容验证角谷猜想 数论中有许多猜想尚未解决,其中有一个被称为“角谷猜想”的问题,该问题在五、六十年代的美国多个著名高校中曾风行一时,这个问题是这样描述的:任何一个大于一的自然数,如果是奇数,则乘以三再加一;如果是偶数,则除以二;得出的结果继续按照前面的规则进行运算,最后必定得到一。现在请你编写一个程序验证他的正确性。 Input本题有多个测试数据组,第一行为测试数据组数N,接着是N行...原创 2019-08-15 12:54:39 · 317 阅读 · 0 评论 -
[Java] HDU-1003
一、内容Max Sum Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14...原创 2019-08-15 12:18:36 · 481 阅读 · 0 评论 -
[Java] HDU-2070
一、内容Fibbonacci Number Your objective for this question is to develop a program which will generate a fibbonacci number. The fibbonacci function is defined as such:f(0) = 0f(1) = 1f(n) = f(n-1) +...原创 2019-08-15 11:39:08 · 492 阅读 · 0 评论 -
[Java] HDU - 2045
一、内容不容易系列之(3)—— LELE的RPG难题 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研究起了著名的RPG难题:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两...原创 2019-08-15 11:33:38 · 496 阅读 · 0 评论 -
[Java] HDU-1563
一、内容Find your present! In the new year party, everybody will get a "special present".Now it's your turn to get your special present, a lot of presents now putting on the desk, and only one of them w...原创 2019-08-15 11:18:54 · 452 阅读 · 0 评论 -
[Java] HDU - 1203
一、内容I NEED A OFFER! Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了。要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的。Speakless没有多少钱,总共只攒了n万美元。他将在m个学校中选择若干的(当然要在他的经济承受范围内)。每个学校都有不同的申请费用a(万美元),并且Speakless估计了他...原创 2019-08-15 10:37:05 · 500 阅读 · 0 评论 -
[Java] HDU - 2955
一、内容Robberies 可怜的POIUYTREWQ最近想买下dota2的商品,但是手头缺钱。他想起了之前看过的一部大片,觉得抢银行也许是个不错的选择。他认为,坏人被抓是因为没有预先规划。于是他在之前的几个月对各大银行进行了一次评估; 评估内容包括安全性和可盗窃金额: 他想知道在在某个风险系数下可以偷窃的最大金额Input第一行给出了一个整数T, 表示有T组测试数据. 对于每一组数...原创 2019-08-15 09:31:35 · 430 阅读 · 0 评论 -
[Java] HDU 2098
一、内容分拆素数和 把一个偶数拆成两个不同素数的和,有几种拆法呢? Input输入包含一些正的偶数,其值不会超过10000,个数不会超过500,若遇0,则结束。Output对应每个偶数,输出其拆成不同素数的个数,每个结果占一行。Sample Input30260Sample Output32二、思路-预先筛出质数,然后i从2开始到n/2去判断是否i 和 n ...原创 2019-08-15 08:51:38 · 512 阅读 · 0 评论 -
[Java] POJ 1011 经典搜索剪枝题
一、思路首先想到的是 枚举下一根棒的长度进行dfs,但是题目给的是64根棒,直接dfs肯定会超时,所以要进行剪枝。进行剪枝:1.一根棒的长度肯定是大于等于所有小棒的最大值的,所以我们从最大值开始枚举,枚举到最大值/2。2.将保存小棒的长度的数组从大到小排序,每次从大的开始选择。因为要组成一根棒,必然要先用到大的小棒。3.将所有小棒的总长度和保存在sum, 如果sum不能被棒的长度整除,...原创 2019-08-10 20:00:46 · 796 阅读 · 0 评论 -
线段树入门
一、引入有一类区间问题可以抽象成如下模型。 给定包含 n个数的数组 a1,a2,⋯an。有两种操作查询区间 [l,r] 最小的数。修改第 ai为 x。这里,为了解决这个问题,我们介绍一种灵活的数据结构——线段树。我们用一棵二叉树来表示线段树,线段树中的每个结点都表示一个区间。每个非叶子结点都有左右两棵子树,分别对应区间的 “左半” 和 “右半”。为了方便起见,我们给根结点编号为 1...原创 2019-08-24 23:05:23 · 567 阅读 · 0 评论 -
计蒜客---公告板
一、内容二、思路线段树的水题,但需要注意的是我们的区间有多大。题目给了一个h和n块板子,所以我们只需要在h 和 n中取一个最小值就是区间的大小了,因为每块板子高度是1,若h > n,那么区间取【1,n】就够了,因为每块板只放一行都只能放n行。我们用c[] 数组来保存某个区间的最大剩余值的下标,这样我们查询那行能够放下这块板子,如果左边的区间能够放下这块板子,那么就往左边递归,反之则...原创 2019-08-25 17:05:49 · 475 阅读 · 0 评论 -
ACM c++程序, 如何从文件读取数据,如何将输出结果保存到文件
一、读取数据包含头文件#include <algorithm> “r” 代表是 从文件中读入, stdin是标准输入流。test.txt文件必须已经创建,这里是相对路径的写法,test文件必须和程序文件放在一起。 //stdin是标准读入 freopen("test.txt","r", stdin);运行结果:int main(){ //stdin是标准...原创 2019-10-11 10:41:07 · 2156 阅读 · 0 评论 -
快速乘 O(lgn) and O(1)
一、O(lgn)快速乘当2个数都是64位整型,且取模的数也很大的情况时,就没有类型能装下相乘后的结果,所以我们需要一种很好的算法来进行计算。类似快速幂一样,乘法相当于就是加法。typedef long long ll;ll mul(ll a,ll b, ll MOD){ ll ans = 0; while (b) { if (b & 1) { ans = (ans...原创 2019-09-19 10:01:20 · 335 阅读 · 0 评论 -
[Java] B. Fire-Fighting Hero (dijkstra)
一、内容The 2019 Asia Nanchang First Round Online Programming Contest B. Fire-Fighting Hero二、思路首先第一次Dijkstra求出以消防英雄为起点到其他点的最短路,在最短路径中找出一个最大值保存下来。第二次最短路,以0点(新构造的点)到消防队所在点都添加一条无向边,权值为0,然后以0点为起点求一次Di...原创 2019-09-08 22:49:28 · 480 阅读 · 0 评论 -
[Java] POJ - 1177 线段树 + 扫描线(周长并)
一、内容PictureA number of rectangular posters, photographs and other pictures of the same shape are pasted on a wall. Their sides are all vertical or horizontal. Each rectangle can be partially or tota...原创 2019-09-05 23:09:15 · 533 阅读 · 0 评论 -
[Java] POJ - 1151线段树+扫描线
一、内容AtlantisThere are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps...原创 2019-09-04 13:12:41 · 565 阅读 · 0 评论 -
[Java] 计蒜客---数字游戏
一、内容二、思路由于数字太大,每次不好直接乘以或除以某个数。所以考虑用线段树保存每个点的值,初始每个点都是1,然后若输入 1 5,边把这个点变成5,若输入的是2 1,便把1这个点变成1。最后查询就是所有点的乘积就是,每次个区间保存的都是区间内所有数的乘积。三、代码import java.io.PrintWriter;import java.util.Scanner;publi...原创 2019-08-28 16:21:22 · 658 阅读 · 0 评论 -
[Java] 计蒜客---蒜头君的玩具
一、内容二、思路用差分数组算出每个点总共被包含了几次,比如1-4就等于1-4区间的数组都加上1。这样a数组最终保存的就是装了这个点总共被覆盖几次。由于每次只能选3条线段,所以数组里面每个点的值必须>=3才符合要求,要后从求一个c3a[i], a[i]表示这个点覆盖的次数,从里面能选出3条线段覆盖的种数。对所有点都求一次组合数,然后所有的组合数相加 / c3m 就是结果了。...原创 2019-08-28 16:17:07 · 734 阅读 · 0 评论 -
[Java] 计蒜客---蒜头君的石子游戏
一、内容二、思路每次取的石子数必定是1,2,3,4·····n,所以一轮下来取的石子总数是n*(n+1) / 2。sum表示所有石子的总和,若sum % (n * (n + 1) / 2) != 0 直接输出NO 因为这种情况不可能取完k = sum / (n * (n + 1) / 2); k代表要取几轮才能取完所有石子。-所以我们只需要判断k 减去2个相邻石子的差是否小于0...原创 2019-08-28 16:08:56 · 507 阅读 · 0 评论 -
[Java] 计蒜客---苹果数 (dfs序)
一、内容二、思路用dfs序将树形结构转换为线性结构,然后用线段树或树状数据进行维护。当用dfs遍历这棵树的时候,进入到这个点是有一个进入时间in,递归完成后有一个退出时间out,所以这个点和它子树所在的区间就是【in[u], out[u]】(u就是这个点)。 static int[] in = new int[N + 5]; // in[j] 代表节点j子树的左端点,也就是节点...原创 2019-08-26 15:59:52 · 716 阅读 · 0 评论 -
计蒜客---最大公约数
一、内容二、思路用线段树维护每个区间的gcd值,单个点的gcd就是它自己本身。由于题目花椰妹可以修改其中的一个(但是本身的值不变,在计算的时候认为是修改了)我们只需要计算出有几个不是花椰妹给出的gcd的倍数,若个数小于等于1 那么输出yes,否则输出no。因为当个数有一个不是花椰妹给出的gcd的倍数,花椰妹可以修改这个数,所以输出还是yes查询的时候就分区间进行查询,若某个区间的值都...原创 2019-08-26 13:54:57 · 674 阅读 · 0 评论 -
计蒜客-奇怪的报数游戏
一、内容二、思路从后往前推,最后一个人的编号一定是排在它前面的人个数+ 1,依次往前推。当我们往前推的时候,后面出现的数就不会再占排名了,所以我们要用树状数组维护已经出现了的编号。用树状数组维护1-1 1-2 1-3····1-n区间里面的值表示已经出现了的编号的次数,初始都为0然后用二分去搜索符合的区间,这样复杂度就是0(nlg2n) for (int i = n - 1; i &...原创 2019-08-26 11:37:20 · 688 阅读 · 0 评论 -
POJ 2251
一、思路这道题是求迷宫最短路径的长度类似的问题,只不过从二维变成了三维而已,因此存储迷宫的数组需要写成三维数组(这里用char arr[L][R][C]表示)。由于增加了一维,每个点能到达的点从二维的4个点变成了现在的6个点,所以需要增加一个tz[]数组来存储新的维度的变化情况。由于迷宫的每个点花费的时间都是相同的,所以直接用队列就能解决。这里用int vis[L][R][C]来表示从起...原创 2019-08-10 17:20:48 · 576 阅读 · 0 评论 -
[Java] HDU 1005
一、思路解法一:找规律。因为F[n]是模7的所以 F[n]的结果只有{0,1,2,3,4,5,6},F[n - 1] 有7个可能,F[n-2]也有7种,那么F[n] 就有 7*7 = 49 种可能,所以49 是一个循环周期。还可以通过打表发现循环周期,不过比较麻烦。解法二:矩阵快速幂二、代码import java.util.Scanner;public class H...原创 2019-08-10 16:52:52 · 511 阅读 · 0 评论 -
[Java]HDU 1576 (费马小定理 + 扩展欧几里得)
思路:(A/B)%9937 = A*B-1 %9973. 这里的B-1 代表乘法逆元,而不是1/B.乘法逆元:A除以一个数模P,等于A乘以这个数的乘法逆元模P。所以我们只需要求解出B对于9973的乘法逆元B-1即可。解法一:费马小定理求解乘法逆元若a是一个整数,b是一个质数,那么 ab ≡ a(mod b) 或 ab-1≡1 (mod b)由扩展欧几里得可以得出:因为gcd(a,...原创 2019-08-08 11:11:19 · 858 阅读 · 0 评论 -
最长公共子序列
转载 2019-08-05 17:37:17 · 399 阅读 · 0 评论 -
最长上升子序列LIS
int dp[1000], a[1000], n;int ans = 0; // 保存最大值for (int i = 1; i <= n; ++i) { dp[i] = 1; for (int j = 1; j < i; ++j) { if (a[j] < a[i]) { dp[i] = max(dp[i], dp...原创 2019-08-05 17:14:02 · 241 阅读 · 0 评论 -
最大子段和
给定一个数组,求最大的一段子段的和:如: num = {-5,12,3,-8,2,-9} 最大的子段和为9 int sum = 0; for (int i = 0; i < N; i++) { if (sum + num[i] < 0) { sum = 0;//若sum小于0 那么之前的一段就不要了 ...原创 2019-08-05 16:53:42 · 446 阅读 · 0 评论 -
欧拉定理 和 欧拉函数
若2个数a,b, GCD(a,b) == 1 ,那么 a^φ(b) ≡ 1 (mod b)欧拉函数性质(1) p^k型欧拉函数:若N是质数p(即N=p), φ(n)= φ§=p-p(k-1)=p-1。若N是质数p的k次幂(即N=pk),φ(n)=pk-p(k-1)=(p-1)p^(k-1)。(2)mn型欧拉函数设n为正整数,以φ(n)表示不超过n且与n互素的正整数的个数,称为n的欧拉函数值...原创 2019-08-03 20:16:42 · 1235 阅读 · 0 评论 -
质数的原根证明
证明:原创 2019-08-03 19:43:43 · 1206 阅读 · 0 评论 -
真分数
真分数就是分子比分母小,且分子分母互质。如 1/3 1/4 1/5 2/5等原创 2019-08-03 17:38:48 · 835 阅读 · 0 评论 -
[java模板] 欧拉函数
import java.util.Scanner;public class 欧拉函数 { static int n; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); System.out.println(euler_one()); }...原创 2019-08-02 15:43:32 · 1151 阅读 · 0 评论 -
7-1字符串的冒泡排序
import java.util.Scanner;public class S7_01 { static int n, k; static String[] str = new String[105]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nex...原创 2019-07-18 16:58:06 · 1395 阅读 · 0 评论 -
7-15 地下迷宫探索
思路:关键在于怎么记录返回的路径.比如题目给出的第一个样例这里从1出发,我们的dfs函数最终会搜到6,这时候我们其他点都被标记为已访问,所以dfs函数就会一层一层的返回,先是返回到点5,然后是点4,所以我们可以直接记录下返回路径.dfs(i)下面就是代表返回的位置,在这里记录返回的点也就是s. 每一层的s都不同,当达到6的时候s就代表5.然后就是不联通的情况:这里从6出发,到搜到最...原创 2019-07-18 16:53:20 · 4493 阅读 · 0 评论 -
猴子排序
猴子排序-------O(n)一、定义猴子本身不易驯服,多动、爱玩和调皮,猴子排序精髓就在一个字乱,所以我们只需要对需要排序的数组进行"随心所欲"的乱排序即可.二、实现1.待排序的数组arr.2.保存已排序的数据的数组res.3.辅助数组help用来记录arr的那个位置已经进行了使用.代码:import java.util.*;public class 猴子排序 { publ...原创 2019-06-27 23:32:17 · 1420 阅读 · 0 评论 -
[Java] POJ 2386
思路:求一个图中有多少个连通快即可。当发现一个点是‘W’时,从这个点出发进行dfs,将他附近8个方向上的点都标记为’.’,且又从这个8个方向(必须是‘W’)进行dfs。最终会将一个连通快全部标记为‘.’。标记一个连通块,进行ans++。最后输出有多少个连通块即可。import java.util.Scanner;public class POJ_2386 { static char[][...原创 2019-08-08 11:30:51 · 670 阅读 · 0 评论
分享