Kattis
Kattis 题解
W_Weirdo
这个作者很懒,什么都没留下…
展开
-
Kattis Problem - Square Peg in a Round Hole
Kattis Problem - Square Peg in a Round Hole原题地址题目类型:贪心、排序题意有 N 块圆形的地, M 个圆形的屋子和 K 个正方形的屋子。在地上修建屋子时不能触碰地的边界。给出每块地的半径以及圆形屋子的半径和正方形屋子的边长,求最多可以修建多少个屋子。分析可以想到,一个屋子在一块地上可以修建时应使地的半径尽可能小。圆形的屋子则可以直接比较半径,而正方形的屋子所占圆的半径是它的对角线的一半。所以将每个屋子的半径处理出来进行排序,再将地的半径进行排序,然后进原创 2021-08-06 10:55:32 · 244 阅读 · 0 评论 -
Kattis Problem - Saving For Retirement
Kattis Problem - Saving For Retirement原题地址题意Bob 从 BBB 岁开始直到 BrB_rBr 岁退休,每年存 BsB_sBs 元钱。Alice 现在 AAA 岁,每年可以存 AsA_sAs 元钱。求 Alice 在多少岁时退休存的钱比 Bob 退休时存的钱多。分析Bob 总共存的钱是 Bs∗(Br−B)B_s * (B_r - B)Bs∗(Br−B),所以 Alice 需要存 Bs∗(Br−B)/As+1B_s * (B_r - B) / A_s原创 2021-08-06 10:16:27 · 106 阅读 · 0 评论 -
Kattis Problem - Keyboardd
Kattis Problem - Keyboardd原题地址题目类型:字符串、映射题意:有一个键盘,其中部分键坏了,按一次会会在屏幕上输入两次。现在给出正确的输入的字符串 s 和用这个坏键盘输入这个字符串后在屏幕上显示的字符串 t。通过这两个字符串确定出是那些键坏了。分析:因为坏的键按一下会打印两次,若一个键是坏的话则它在 s 中一个其中字符相同的连续的子串长度为 l,那么对应在 t 中其长度就应该是 2 * l。那么就检查 s 中每一个连续相同的子串在 t 中显示的长度是否是 2 * l,如果原创 2021-07-29 00:33:03 · 115 阅读 · 0 评论 -
Kattis Problem - Planina
Kattis Problem - Planina原题地址题目类型:规律题意:首先平面上有四个点形成的方块,每次进行如下操作:在相邻顶点的中间添加一个点以及在此方块的中心添加一个点。求经过 N 此迭代后点阵中点的数量。分析:枚举观察几个样例后发现点阵边上点的数量的变化规律为 x+(x −1),而点阵中点的数量则是边长的乘积。因为数据范围较小可以事先打表提升效率(貌似没啥用)。代码:static final int[] TB = {0, 9, 25, 81, 289, 1089, 4225, 1原创 2021-07-29 00:24:23 · 96 阅读 · 0 评论 -
Kattis Problem - Hot Springs
Kattis Problem - Hot Springs原题地址题目类型:构造题意:重排一个含有 n 个整数的序列,使得所有的 |a_(i−1) − a_i |≤|a_i − a_(i+1) |。分析:先对数组排序。然后考虑最大的差的绝对值是 a_max − a_min, 然后将最大值放在第 n - 1 的位置,将最小值放在第 n 的位置。然后再剩下的数中选择最大值和最小值,按相同的逻辑进行构造。代码:public static void solve() throws IOExcept原创 2021-07-29 00:12:13 · 277 阅读 · 0 评论 -
Kattis Problem - Jack-O‘-Lantern Juxtaposition
Kattis Problem - Jack-O’-Lantern Juxtaposition原题地址题目类型:数学、排列组合题意:现在有眼睛、鼻子、嘴巴三种设计分别有 N、T、M 种。可以通过随意从中各取一个进行组合得到不同的设计。统计总共有多少种不同的设计。分析:排列组合问题。代码:public static void solve() throws IOException { int N = nextInt(); int T = nextInt(); int M =原创 2021-07-29 00:08:33 · 104 阅读 · 0 评论 -
Kattis Problem - Sibice
Kattis Problem - Sibice原题地址题目类型:数学题意:在地上散落了一些火柴,每个火柴都有各自的长度,现在需要将它们收集到一个长 h、宽 w 的火柴盒中,判断有哪些火柴可以装进去,哪些不可以装进去。分析:火柴盒可以装的最大长度的火柴是它的斜边的长度,然后用每个火柴和斜边的长度进行比较。代码public static void solve() throws IOException { int n = nextInt(); int w = nextInt();原创 2021-07-29 00:03:25 · 115 阅读 · 0 评论 -
Kattis Problem - Contest Struggles
Kattis Problem - Contest Struggles原题地址题目类型:数学题意:给出 n 道题难度的平均分 d(一道题难度的分值为[0, 100]),猜测其中 k 道题难度的平均分为 s。判断这个猜测是否正确,如果正确输出剩余题目的平均分,否则输出 impossible。分析:通过 n * d 算出总分数,然后减去 k * s 得到剩余题目难度的总分,然后再除 n - k,判断结果是否在 [0, 100]范围内(输出时注意精度)。代码:public static void原创 2021-07-28 23:55:46 · 116 阅读 · 0 评论 -
Kattis Problem - Yoda
Kattis Problem - Yoda原题地址题目类型:模拟题意:给定两个数字,从它们的最低位开始进行比较,该位数字的值严格小于另一方的,则该位的数字会掉落。最终两个数字的值会变为多少。分析:因为是需要每一位都进行比较,所以使用字符串处理会更方便。代码:public static void solve() throws IOException { char[] a = next().toCharArray(); char[] b = next().toCharArray原创 2021-07-28 22:54:27 · 106 阅读 · 0 评论 -
Kattis Problem - Freckles
Kattis Problem - Freckles原题地址题目类型:最小生成树题意:在纸上有 n 个点(坐标形式给出),可以用钢笔划线将点连接起来。现在需要用钢笔连线使得所有的点都连通,并使用墨水最少,画线使用墨水的值等于线的长度。分析:很明显是要求其最小生成树。在每两个点之间建边,长度为其之间的距离,然后使用 Prim 算法求其最小生成树。使用 Kruskal 算法会超时。代码static double[] x;static double[] y;static double[][] G原创 2021-07-28 22:45:47 · 87 阅读 · 0 评论 -
Kattis Problem - Popular Vote
Kattis Problem - Popular Vote原题地址题意有 n 个候选人,给出每个人获得的投票数,判断谁能获胜。分析先对其进行排序,如果票数最多的和第二多的票数一样则说明没有获胜者,如果最多的票数的 2 倍大于总票数则是 Majority winner 否则是 Minority winner。代码public static void solve() throws IOException { int n = nextInt(); Pair[] a = ne原创 2021-07-10 09:15:01 · 89 阅读 · 0 评论 -
Kattis Problem - Elementary Math
Kattis Problem - Elementary Math原题连接题意有 n 对整数,每对整数都可以使用 +、-、* 三种运算符进行运算。现在需要为每对整数选择一种运算符,并且保证最终 n 对整数的解都是不同的。分析对于每对数因为都有三种运算符,所以都有三个解,可以将每对数与它的解之间连一条边,则每对数与所有可能解构成一个二分图,然后就可以使用匈牙利算法来进行二分图的最大匹配。如果最后匹配了 n 个则说明存在解,然后根据匹配的结果输出每对数使用的运算符,否则无解。因为操作数比较大,所有要先离原创 2021-07-09 23:36:59 · 136 阅读 · 0 评论 -
Kattis Problem - Island Hopping
Kattis Problem - Island Hopping原题链接题意有 m 个岛,给出每个岛的坐标,在两个岛之间建桥的花费等于两个岛之间的距离。求使所有岛连通所需要建桥的最小花费。分析很明显是要求其最小生成树。在每两个岛之间建边,长度为其之间的距离,然后使用 Kruskal 算法求其最小生成树。代码static int[] fa;public static void solve() throws IOException { int m = nextInt();原创 2021-07-09 11:14:38 · 227 阅读 · 0 评论 -
Kattis Problem - Soundex
Kattis Problem - Soundex原题链接题意给定 Soundex Code 编码的规则,将输入的字符串转为 Soundex Code 编码。分析模拟即可,注意没有定义 Soundex Code 编码的字符不用处理,连续 Sound Code 编码相同的字符视为一个。代码static final int[] TB = {0, 1, 2, 3, 0, 1, 2, 0, 0, 2, 2, 4, 5, 5, 0, 1, 2, 6, 2, 3, 0, 1, 0, 2, 0, 2};p原创 2021-07-09 10:21:58 · 132 阅读 · 0 评论 -
Kattis Problem-Missing Gnomes
Kattis Problem-Missing Gnomes原题地址题意给定 n 的排列的一个子序列,然后求出在 n 的排列中含有该子序列且字典序最小的排列。分析贪心,想要最终的字典序最小,那么可以维护一个在子序列中未出现数字的集合,然后依次枚举每一个位,每次选子序列中和未使用的数字中较小的那个来填充。代码public static void solve() throws IOException { int n = nextInt(); int m = nextInt();原创 2021-07-09 09:06:38 · 79 阅读 · 0 评论 -
Kattis Problem-The Trip, 2007
Kattis Problem-The Trip, 2007原题链接题意有 N 个背包,如果一个背包的尺寸严格小于另一个背包的尺寸,则尺寸较小的那个背包可以嵌套进尺寸较大的那个背包中,也就是说可以通过嵌套减少背包的数量。求背包的数量最少是多少,并打印背包嵌套的方案。分析使用贪心的思想,一个背包中尽可能的嵌套一个尺寸比它小的背包中尺寸最大的那个背包,就是说在可以嵌套的情况下尽可能选择大的。可以通过 TreeMap 中的 lowerKey() 方法获得第一个第一个严格小于它的背包,重复此过程知道不存在可原创 2021-07-08 14:21:18 · 111 阅读 · 0 评论 -
Kattis Problem-Unique Snowflakes
Kattis Problem-Unique Snowflakes原题链接题意给定一个整数序列,找出最长的不重复子串的长度。分析使用双指针,枚举每个指针 I,然后每次判断指针 j 最远可以指到那里。代码public static void solve() throws IOException { int n = nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) a[原创 2021-07-08 14:12:04 · 85 阅读 · 0 评论 -
Kattis Problem-Lektira
Kattis Problem-Lektira原题链接题意:在一个字符串上任选两个位置进行切割将其分为 3 段,并将每一段进行反转,然后再按原来的顺序拼接起来。求通过该操作可以获得的字典序最小的字符串。分析因为题目的数据范围较小,所以可以暴力枚举所有切割点,然后选取字典序最小的那个。代码public static void solve() throws IOException { char[] s = next().toCharArray(); char[] a = new ch原创 2021-07-06 19:44:30 · 100 阅读 · 0 评论 -
Kattis Problem - The Maze Makers
Kattis Problem-The Maze Makers原题链接题意给定一个由 16 进制数据描述的迷宫,判断是否是以下四种情况之一:1、从起点无法到达终点2、至少存在一对点是不连通的3、对于一对点之间不止一条简单路径4、不存在上述 3 种情况,地图是 Ok 的分析题目本身并不难,只不过需要理解到如何去建图(并不是真的把迷宫画出来,这样有点繁琐)。因为迷宫中一个格子是由一个 16 进制的数来描述,其上、右、下、左的状态由其 16 进制数对应位置的二进制位(高位到低位)来表示,1 代表原创 2021-07-06 17:20:18 · 102 阅读 · 0 评论 -
Kattis Problem - Jewelry Box
Kattis Problem - Jewelry Box原题链接题意给定一个大小为 X * Y 大小的 卡纸,然后在其中裁取如下图形然后用裁下的部分拼成一个无盖的矩形纸盒,然后求可拼成矩形纸盒的最大体积。分析根据带入一些值和所给的样例结果发现,纸盒的体积随高 h 的变换称一个凸函数,所以使用三分来求出纸盒体积的最大值。具体细节可参考代码代码import java.io.BufferedReader;import java.io.BufferedWriter;import java.i原创 2021-05-13 10:33:02 · 136 阅读 · 0 评论 -
Kattis Problem - Radio Commercials
Kattis Problem - Radio Commercials原题链接题意给定 n 个连续的时间段期间收看广告的人的数量,和发布一个广告所需要的费用 p,假设每有一个人收看广告则会有一元的收益。现在需要找一个连续的播放广告的时间段子序列使收益总和最大。分析设 dp[i] 是以第 i 段结尾的收益的最大和状态转移如果 dp[i - 1] < 0 则说明 dp[i-1] 对 dp[i] 做负贡献,即 dp[i-1] + a[i] < a[i]。所以当 dp[i-1] >原创 2021-05-08 18:36:20 · 220 阅读 · 0 评论 -
Kattis Problem - Prozor
Kattis Problem - Prozor原题链接题意有一个 R x S 大小的矩形窗户,在窗户上趴着一些苍蝇,现在有一个边长为 K 的正方形苍蝇拍,求拍一次所能攻击到的苍蝇的最大数量(苍蝇拍一定是拍在窗户内部,且边界处的苍蝇是可以逃走的所以不计数),在窗户中 ‘*’ 代表苍蝇 ‘.’ 代表空白。分析因为边界处的苍蝇不计数,所以枚举所有 边长为 k -1 的正方形中苍蝇的数量然后取最大值,枚举所有正方形可以通过预处理矩形的二维前缀和优化。具体细节参考代码。代码import java.io原创 2021-05-08 17:08:55 · 71 阅读 · 0 评论 -
Kattis Problem - The Weight Of Words
Kattis Problem-The Weight Of Words原题链接题意有一个名叫“单词的权重”的游戏,游戏规定26个小写字母即 ‘a’~‘z’ 的权重分别为 1~26。现在给定一个字符串的长度 L 和其所有字符的权重和 W,判断满足这两个条件的字符串是否存在,如果存在则输入满足条件的任意解,否则输出 “impossible”。分析因为如果存在解可以输入任意解,所以可以进行构造。我们可以求出字符串的最小权重和最大权重即1 * L 和 26 * L,如果 W 不在这个区间则一定无解。如果存在原创 2021-05-08 16:37:44 · 125 阅读 · 0 评论