一些题目(2)

奶牛选举

搜索

题意:在 5*5 的矩阵中找出规模为 7 的四连通块的个数。

初步解法:枚举第一个被取的格子是哪个。对于每个格子,若其上下左右四个格子已经有被取过的格子,就枚举其取或不取;否则不取当前格子。但是很明显是错的,因为在初始格子的周围添加一个后,能够取的格子就会变多,但是由于是顺序枚举,就会漏掉前面的可以取的格子。

正解:直接把上面的方法中「判断其四周是否有被取过的格子」这一步删掉。

更好的解法是把 7 拆成 4+3,也就是先深搜出一条长度为 4 的四连通块,注意是一条,也就是直接用深搜每次单方向扩展。然后在这个规模为 4 的连通块周围添加上 3 个格子即可。

?

约瑟夫问题

线段树

分析:我们知道约瑟夫问题的瓶颈在于找到下一个出圈的人的编号。如果用标记数组或链表,即使加了取模优化也仍然不够理想,依然是线性的复杂度。所以我们要用线段树来实现 O(logn) 的查找。

线段树一般用于统计,在这个问题中我们可以用线段树统计一个区间内的「剩余人数」。

那么,当我们要查找当前剩余的人中的第 k 个人时,就从根节点开始不断往下找。如果当前结点的左子树剩余人数大于等于 k,就在左子树中查找;否则在右子树中查找。找到一个人后删去,维护区间的剩余人数。

?

最舒适路线

枚举+并查集

题意:找出一条最大边与最小边比值最小的路径。

初步解法:枚举最大边是哪条,二分枚举最小边是哪条,用并查集判断连通性。

正解:先将边排序,枚举最小边是哪条,然后从最小边开始不断往图中依次加边,直到两点连通为止。这里运用了一点贪心的思想:确定了最小边之后,往后不断添加边直到两点连通,此时不必再加边,所以确定最小边之后,就已经确定了此时的最优解(如果有解的话),最大边就不用再枚举了,可以判断出此时最大边的最小值,即得到此时的最优情况。

时间: 2024-10-06 18:42:33

一些题目(2)的相关文章

四则运算题目生成程序

a.需求分析 看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习.练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 =

四则运算题目生成程序(基于控制台)

题目描述: 能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 功能设计: 1.  通过随机数的生成,实现+, ?, ×, ÷的确定 2.  +, ?, ×, ÷分别赋予整

记一次坑die(误)的题目--HDU2553--(DFS)

,N皇后问题   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 720 Accepted Submission(s): 417 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合

九度oj 题目1552:座位问题

题目描述: 计算机学院的男生和女生共n个人要坐成一排玩游戏,因为计算机的女生都非常害羞,男生又很主动,所以活动的组织者要求在任何时候,一个女生的左边或者右边至少有一个女生,即每个女生均不会只与男生相邻.现在活动的组织者想知道,共有多少种可选的座位方案. 例如当n为4时,共有 女女女女, 女女女男, 男女女女, 女女男男, 男女女男, 男男女女, 男男男男7种. 输入: 输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000). 输出: 对于每组测试用例,输出一个数代表可选的方

201301 JAVA题目0-1级

题目描述 编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 输入描述: 第一行是数据个数,第二行是输入的数据 输出描述: 返回true或者false 输入例子: 4 1 5 -5 1 输出例子: true 1 import java.util.*; 2 3 public class Main46 { 4 public

九度oj 题目1499:项目安排

题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

题目1124:Digital Roots (方法超简单)

题目1124:Digital Roots 学到的新知识 求一个数各个的和可以把其%9就行,例如13%9=4 11%9=2:123%9=6: 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3819 解决:1335 题目描述: The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then

上机题目(初级)-高次方数的尾数(Java)

题目如下: 代码如下: package huawei; public final class Demo { /* 功能: 求解M的N次方的最后三位数(M,N均大于10) 输入参数: int M:M > 10 int N:N > 10 返回值: M的N次方的最后三位数 */ public static int getLast3DigitsOfMN(int M, int N) { int result = 1; for(int i = 0;i < N;++i){ result = (resu

算法学习 并查集(笔试题目:找同伙)

题目背景太长,记得不清楚,暂参考<啊哈算法>一书,根据笔试题目大意改编如下: 警察正要捉获某地区的犯罪团伙,由于强盗人数过大,想查清楚有几个团伙非常困难. 根据上级指示,需要首先尽快抓获强盗A所在的团伙,这需要掌握 1 所在团伙的人数.先有资料如下: 强盗1 和 强盗2 是同伙 强盗3 和 强盗4 是同伙 强盗2 和 强盗5 是同伙 强盗3 和 强盗2 是同伙 注意,强盗的同伙的同伙也是同伙,问  强盗1 的同伙(不包括1自己)有多少人? 该题形式化表示如下: 每个测试实例首先包括2个整数:N

题目1191:矩阵最大值

题目描述: 编写一个程序输入一个mXn的矩阵存储并输出,并且求出每行的最大值和每行的总和. 要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值. 最后将结果矩阵输出. 输入: 输入的第一行包括两个整数m和n(1<=m,n<=100),分别代表矩阵的行和列的维数. 接下来的m行每行有n个数,代表矩阵的元素. 输出: 可能有多组测试数据,对于每组数据,输出按题目要求执行后的矩阵. 样例输入: 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3