Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >解决一系列问题所需的最少天数

解决一系列问题所需的最少天数
EN

Stack Overflow用户
提问于 2012-04-24 18:24:37
回答 3查看 7.3K关注 0票数 5

您需要完成编号为1..N的N个问题。你已经按照难度递增的顺序排列了问题,并且第i个问题估计了难度等级i。你还为每个问题分配了一个等级vi。具有相似vi值的问题本质上是相似的。每一天,你都要选择问题的一个子集并解决它们。你已经决定,当天解决的每个后续问题都应该比你当天解决的前一个问题更难。此外,为了不让它变得无聊,你解决的连续问题的vi评分应该至少相差K。你可以解决所有问题的最少天数是多少?

输入:第一行包含测试用例的数量,测试用例紧随其后。每个case在第一行包含一个整数N和K,然后在第二行包含整数v1,...,vn。

输出:输出T行,每个测试用例一行,包含可以解决所有问题的最小天数。

约束条件:

1个<= T <= 100

1个<= N <= 300

1个<= vi <= 1000

1 <= K <= 1000

示例输入:

2

3 2

5 4 7

5 1

5 3 4 5 6

示例输出:

2

1

这是interviewstreet面临的挑战之一。

下面是我的方法

从第一个问题开始,找出可以解决的问题的最大可能数量,并再次从问题list.Now中删除这些问题,从剩余列表的第一个元素开始,这样做到现在问题列表的大小为0。我从这种方法中得到了错误的答案,所以寻找一些算法来解决这个挑战。

EN

回答 3

Stack Overflow用户

发布于 2012-05-09 00:05:47

算法很简单。首先,按v_i对问题进行排序,然后,对于每个问题,查找(v_i-K, v_i]间隔中的问题数。这些数字中的最大值就是结果。第二阶段可以在O(n)中完成,因此最昂贵的操作是排序,从而使整个算法成为O(n log n)Look here for a demonstration of the work of the algorithm on your data and K=35 in a spreadsheet.

为什么这是可行的

让我们将这个问题重新表述为图着色问题。我们创建图G如下:顶点将是问题,在两个问题之间将有一条边当且仅当|v_i - v_j| < K

在这样的图中,独立集恰好对应于当天可做的问题集。(<=)如果集合可以在一天内完成,那么它肯定是一个独立的集合。(=>)如果集合中不包含两个不满足K-difference标准的问题,则只需按难易程度排序并按此顺序解决它们。这两个条件都将通过这种方式得到满足。

因此,很容易得出图G的颜色完全对应于问题在不同日期的时间表,每种颜色对应于一天。

因此,我们想要找出图G的色度,一旦我们认识到这个图是一个区间图,这是一个完美的图,那些色度等于团的图,这两个都可以通过一个简单的算法找到。

区间图是实线上的区间图,边是相交的区间之间的边。我们的图,很容易看到,是一个区间图(对于每个问题,分配一个区间(v_i-K, v_i]。很容易看出,这个区间图的边就是我们图的边)。

引理1:在区间图中,存在一个顶点,它的邻居形成一个团。

证明很简单。您只需取所有区间中具有最低上界(或最高下界)的区间。任何与其相交的区间都有较高的上界,因此,第一个区间的上界包含在它们的交集中。因此,他们彼此相交,形成了一个集团。qed

引理2:在导出子图上封闭的图族中,具有引理1(顶点的存在,其邻居形成团)的性质,以下算法产生最小着色:

从图中找出顶点x,它的邻域从图中形成一个clique.

  • Remove x,使其子图G‘。

  • G’

x by 上找不到的最少的颜色

证明:在(3)中,算法通过归纳假设+我们的族在诱导子图上的贴近度产生子图G‘的最优着色。在(4)中,该算法仅当在x的邻域上存在大小为n-1的团时才选择一个新的颜色n,也就是说,对于x,G中有一个大小为n的团,因此它的色度必须至少为n。因此,算法提供给顶点的颜色始终是<= chromaticity(G),这意味着着色是最佳的。(显然,该算法会生成有效的着色)。qed

推论:区间图是完美的(完美<=>色度==团)

所以我们只需要找到G的团度,这对于区间图来说很容易:你只需处理不包含区间边界的实线的线段,并计算那里相交的区间数,这在你的例子中就更容易了,因为区间的长度是一致的。这导致了本文开头概述的算法。

票数 2
EN

Stack Overflow用户

发布于 2012-11-22 13:56:21

我们真的需要转到路径覆盖吗?我们就不能遵循和LIS类似的策略吗?

输入按照复杂度递增的顺序排列。我们只需要为每天要执行的任务维护一堆队列。通过比较所有队列的最后一个元素,输入中的每个元素都将被分配到一天。只要我们发现'k‘的不同之处,我们就将任务附加到该列表中。

例如:5 3 4 5 6

1)输入-> 5(空列表,开始新列表)

5

2) 3(仅列表5& abs(5-3)是2 (k),因此附加3)

5--> 3

3) 4(只列出最后的vi,3和abs(3-4) < k,所以开始一个新的列表)

5--> 3

4.

4) 5 (abs(3-5)=k追加)

5-->3-->5

4.

5) 6 (abs(5-6)

5-->3-->5

4-->6

我们只需要维护一个包含每个列表的最后一个元素的数组。由于天的顺序(当任务要完成时并不重要),我们可以维护最后任务的排序列表,因此,搜索插入新任务的位置只是寻找值abs(vi-k),这可以通过二进制搜索来完成。

复杂性:

该循环针对N个元素运行。在最坏的情况下,我们可能会使用二进制搜索(log i)来查询许多输入的ceil值。

因此,T( N ) < O( log!)= O(N log )。分析以确保上界和下界也是O( N log N )。复杂度为THETA (N log N)。

票数 0
EN

Stack Overflow用户

发布于 2015-12-01 18:05:17

所需的最小天数将与G (DAG)的互补(无向)图中最长路径的长度相同。这可以用迪尔沃思定理来解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10303800

复制
相关文章
Linux 删除文本中的重复行
这里我做了个简单的测试,当file中的重复行不再一起的时候,uniq将服务删除所有的重复行。经过排序后,所有相同的行都在相邻,因此unqi可以正常删除重复行。
阳光岛主
2019/02/19
8.7K0
【Oracle笔记】数据表中删除重复记录的SQL
  ROWID是ORACLE中的一个重要的概念。用于定位数据库中一条记录的一个相对唯一地址值。通常情况下,该值在该行数据插入到数据库表时即被确定且唯一。   ROWID它是一个伪列,它并不实际存在于表中。它是ORACLE在读取表中数据行时,根据每一行数据的物理地址信息编码而成的一个伪列。所以根据一行数据的ROWID能找到一行数据的物理地址信息。从而快速地定位到数据行。数据库的大多数操作都是通过ROWID来完成的,而且使用ROWID来进行单记录定位速度是最快的。
程序员云帆哥
2022/05/12
2.8K0
SQL:删除表中重复的记录
--创建测试表 if object_id('test') is not null drop table test create table test ( id int identity(1,1) primary key, name varchar(50) ) --插入几条测试数据 insert into test select 'a' union all select 'a' union all select 'a' union all select 'a' union all select 'a
用户8983410
2021/11/02
4.8K0
oracle中如何删除重复数据
        我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?         重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。 一、对于部分字段重复数据的删除         先来谈谈如何查询重复的数据吧。         下面语句可以查询出那些数据是重复的:   select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1         将上面的>号改为=号就可以查询出没有重复的数据了。         想要删除这些重复的数据,可以使用下面语句进行删除   delete from 表名 a where 字段1,字段2 in     (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)         上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:   CREATE TABLE 临时表 AS   (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)         上面这句话就是建立了临时表,并将查询到的数据插入其中。         下面就可以进行这样的删除操作了:   delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);         这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。        这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。        在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录, 我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。        下面是查询重复数据的一个例子:   select a.rowid,a.* from 表名 a  where a.rowid !=  (   select max(b.rowid) from 表名 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  )        下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。        而外面就是查询出除了rowid最大之外的其他重复的数据了。        由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:  delete from 表名 a  where a.rowid !=  (   select max(b.rowid) from 表名 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  )        随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。   create table 临时表 as     select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;   delete from 表名 a  where a.rowid !=  (   select b.dataid from 临时表 b   where a.字段1 = b.字段1 and   a.字段2 = b.字段2  );  commit; 二、对于完全重复记录的删除         对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:   select distinct * from 表名   可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:   CREATE TABLE 临时表 AS (select distinct * from 表名);   truncate table 正式表;            --注:原先由于笔误写成了drop table 正式表;,现在已经改正过来   insert into 正式表 (select * from 临时表);   drop table 临时表;
源哥
2018/08/28
2.4K0
Linux删除重复行
第一,用sort+uniq,注意,单纯uniq是不行的。 sort -n test.txt | uniq
阳光岛主
2019/02/19
11.7K0
MySQL | 查找删除重复行
本文讲述如何查找数据库里重复的行。这是初学者十分普遍遇到的问题。方法也很简单。这个问题还可以有其他演变,例如,如何查找“两字段重复的行”(#mysql IRC 频道问到的问题)
逍遥子大表哥
2021/12/17
5.8K0
MySQL | 查找删除重复行
如何用 awk 删除文件中的重复行【Programming】
了解如何在不排序或更改其顺序的情况下使用awk'!visited $ 0 ++'。
Potato
2019/11/09
8.8K0
如何用 awk 删除文件中的重复行【Programming】
如何删除相邻连续的重复行?
根据题意的要求,把要求的结果在原表上用黄色标出,通过观察发现连续登录的某一个页面只保留第一次访问的记录。解题思路是要通过查询,利用信息差过滤掉同一个页面第一次登录后的连续访问记录。
猴子数据分析
2022/07/13
4.6K0
如何删除相邻连续的重复行?
Word VBA技术:删除表格中内容相同的重复行
上面的代码区分大小写,即第一列中内容相同但大小写不同不会被删除。下面的代码操作时不区分大小写:
fanjy
2023/02/24
4.5K0
使用VBA删除工作表多列中的重复行
自Excel 2010发布以来,已经具备删除工作表中重复行的功能,如下图1所示,即功能区“数据”选项卡“数据工具——删除重复值”。
fanjy
2022/11/16
11.5K0
使用VBA删除工作表多列中的重复行
MySQL 如何查找删除重复行?
第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。本文要用到的数据样本:
Bug开发工程师
2020/03/12
6.6K0
MySQL 如何查找删除重复行?
MySQL 如何查找删除重复行?
第一步是定义什么样的行才是重复行。多数情况下很简单:它们某一列具有相同的值。本文采用这一定义,或许你对“重复”的定义比这复杂,你需要对sql做些修改。本文要用到的数据样本:
芋道源码
2019/10/22
5.6K0
sql删除重复记录
where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
王念博客
2019/07/24
2.2K0
【DB笔试面试469】Oracle中如何删除表中重复的记录?
平时工作中可能会遇到这种情况,当试图对表中的某一列或几列创建唯一索引时,系统提示ORA-01452 :不能创建唯一索引,发现重复记录。这个时候只能创建普通索引或者删除重复记录后再创建唯一索引。
AiDBA宝典
2019/09/30
2.8K0
sql去掉重复的行_select去掉重复记录
如果是这种情况的话用distinct是过滤不了的,这就要用到主键id的唯一性特点及group by分组
全栈程序员站长
2022/11/11
2.9K0
删除SQL数据库表中的重复记录
在n条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复并保留一条呢?方法如下:
学派客
2023/04/07
4.3K0
Linux实用技巧——删除重复行
0. 前言 对于删除文件中的重复行,比如处理如下文件 [root@mobius ~]$cat file_test.txt aaa bbbbb ccccc 123 aaaaa 123 bbb aaa 需要得到的删除为: 123 aaa aaaaa bbb bbbbb ccccc 下面给出四种方法 1. sort -u方法 有关 sort 命令操作见Linux 工作常用命令笔记-sort排序 解决方案如下: [root@mobius ~]$sort -u file_test.txt 123 aaa aaaaa
莫斯
2020/09/10
2.8K0
VBA:基于指定列删除重复行
文章背景:在工作生活中,有时需要进行删除重复行的操作。比如样品测试时,难免存在复测数据,一般需要保留最后测试的数据。之前通过拷贝行的方式保留最后一行的数据(参见文末的延伸阅读1),但运行效率较低。目前通过借助数组和字典达到删除重复行的效果。
Exploring
2022/12/18
3.4K0
VBA:基于指定列删除重复行
VBA:根据指定列删除重复行
文章背景:在工作生活中,有时需要进行删除重复行的操作。比如样品测试时,难免存在复测数据,一般需要删除第一行数据,保留后一行的数据。
Exploring
2022/09/20
3.2K0
点击加载更多

相似问题

删除Oracle SQL中重复的行

10

Oracle SQL :如何删除重复行

57

删除R中的半重复行

33

删除R中的“半重复”行

21

sql联合删除“半重复”。

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文