摘要: 问题: 给出一个数组$a[n]$,求第$k$小元素是什么。 解析: 分治思想,将数组五个一组划分,并计算出每组数的中位数。然后把各组中位数的中位数找出。统计数组中小于中位数的个数$num$,有三种情况。 ① $num = k$,则中位数就是要查询的数。 ② $num > k$,则在小于中位数的集合中 阅读全文
posted @ 2020-04-07 21:49 Big-Kelly 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定一个序列,可以把左边任意长度为$i$的连续序列移动到最右边(不改变连续序列的顺序)。如: 原序列为:$a_1,a_2,a_3,...,a_i,a_{i+1},...,a_{n-1},a_n$ 移动后的序列为:$a_{i+1},a_{i+2},...,a_{n-1},a_n,a_1,a_2 阅读全文
posted @ 2020-04-06 12:09 Big-Kelly 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 问题: 对$n$个不同的数构成的数组$A[1..n]$进行排序,其中$n=2^k$。 解析: 分治思想,对于每个点堆,分成l和r两个点集,分别求每个点集中点的最近对。三种情况: ①$ l = r $:只有一个点,返回 $inf$ ②$l = r – 1$:两个点,返回两个点的点距。 ③$l = r 阅读全文
posted @ 2020-03-30 22:10 Big-Kelly 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 题意: $n$张卡片,每张卡片有4个属性$w,x,isMagic,isSpellBoost$分别表示花费,伤害,是否为魔法卡,是否为作用卡。如果使用一张魔法卡,可以使所有未使用的作用卡的费用减$1$,已知有$W$的钱,求造成的最大伤害。 思路: $dp[i][j]$表示使用了$i$张魔法卡,花费$j 阅读全文
posted @ 2020-03-30 11:10 Big-Kelly 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 题意: 给一个小写字母组成的串,问长度为$K$的不重复的子序列有多少个。 思路: $dp[i][j]$表示长度为$i$的最后一位为$j$的子序列的个数。 转移方程为:$dp[i][j]=\sum_{k=0}^{25}{dp[i-1][k]}$。 特判$K=0$时个数为$1$。 代码: 1 #incl 阅读全文
posted @ 2020-03-30 10:54 Big-Kelly 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定整数$c$和数组$a$,$b$。$a_i$表示通过爬楼梯的方法从第$i$层到$i+1$层需要的时间,$b_i$表示通过坐电梯的方法从第$i$层到$i+1$层需要的时间,坐电梯前需要等$c$单位时间,求从第一层到各层的时间。 思路: $dp[i]=min\left\lbrace\ dp[j 阅读全文
posted @ 2020-03-30 10:37 Big-Kelly 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 题意: 一个$N$行$M$列的矩阵,其中$"."$代表空地,$"H"$代表房子,$"m"$代表人,其中有$n$个房子和$n$个人。现在要求每个人进入其中的一间房子,且每人每走一步需要支付$1$美元。求最小需要花费多少美元能让所有人都进入到房子中(每个人只能进入一间房子,每个房子只能容纳一个人)。 思 阅读全文
posted @ 2020-03-29 17:37 Big-Kelly 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 题意: 有C头奶牛和K台挤奶机,已知每台挤奶机只能给M头牛挤奶。奶牛编号从K+1 到 K+C,挤奶机编号从1 到 K。现在给你一个 (K + C) * (K + C)的矩阵,矩阵第 i 行 第 j 列 的元素代表第i个点到第j个点的距离。求给每头奶牛挤奶的,使得C头奶牛需要行走的路程中的最大路程的最 阅读全文
posted @ 2020-03-29 16:34 Big-Kelly 阅读(267) 评论(0) 推荐(0) 编辑
摘要: 1 struct stortest_Floyd { 2 int a[5000][5000]; 3 void floyd(int num) { 4 for (int k = 1; k <= num; k++) { 5 for (int i = 1; i <= num; i++) { 6 for (in 阅读全文
posted @ 2020-03-29 16:05 Big-Kelly 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 问题: 对n个不同的数构成的数组A[1..n]进行排序,其中n=2^k. 解析: 根据分治的思想,对于每一个待排序的数组,拆分成左右两端,分别对左右两段进行排序,对于已经有序的两个数组把他们合并起来。 设计(核心代码): 1 void merge(int low,int mid,int high) 阅读全文
posted @ 2020-03-23 21:54 Big-Kelly 阅读(137) 评论(0) 推荐(0) 编辑