草庐IT

algorithm

全部标签

c++ - 将数字 n 拆分为 k 个不同数字的总和

我有一个数字n,我必须将它分成k个数字,这样所有k个数字都是不同的,k个数字的总和等于n,并且k是最大值。例如,如果n为9,则答案应为1,2,6。如果n是15那么答案应该是1,2,3,4,5。这是我试过的-voidfindNum(intl,intk,vector&s){if(k最初k=n且l=1。结果数字存储在s中。该解决方案即使将数字n作为k个不同数字的总和返回,但它不是最佳解决方案(k不是最大的)。n=15的示例输出为1,2,4,8。应该进行哪些更改才能获得正确的结果? 最佳答案 贪心算法适用于此问题。刚开始从1到m求和这样su

c++ - 插入排序还是选择排序的变体?

我有一个代码片段here.测试了几个案例,似乎工作正常。学习了算法后,我一下子写出了插入排序的代码,但是有疑问,这真的是传统的插入排序吗?我觉得这可能是选择排序的变体(调整版),这是我困惑的原因。具体来说,这是值得关注的领域:(给定n元素的数组a)for(i=1;i此外,这种方法的比较或交换次数是多了还是少了?在此先感谢您的帮助。 最佳答案 你的问题最直接的答案是是,就是插入排序。这是一种非常低效的插入排序,但它仍然是插入排序。您的代码缺少决定性的步骤,即一旦确定元素的位置,就可以停止比较,然后对已排序的序列进行移位操作,从而为新元

c++ - 找到小于特定值的最大排列

这是一个我似乎不知道如何解决的特定编程问题。Giventwointegersaandb,findthelargestpermutationofthedigitsofathatislessthanb.有什么方法可以在c++中使用next_permutation函数?或者,我应该使用某种形式的动态规划来解决这个问题吗?我尝试使用next_permutation函数测试a的所有排列,但因为整数的大小可以达到10^18、18!太大了,这不可行。有什么办法可以减少时间吗?如果不是,我应该如何使用动态规划来解决这类问题?我将不胜感激任何形式的帮助。非常感谢你们! 最佳答

c++ - 两组的有效交集

我有两个集合(或map),需要高效处理它们的交叉点。我知道有两种方法可以做到这一点:像std::set_intersection一样遍历两个映射:O(n1+n2)遍历一个映射并在另一个映射中查找元素:O(n1*log(n2))根据大小,这两个解决方案中的任何一个都明显更好(已经计时),因此我需要根据大小(这有点困惑)在这些算法之间切换-或者找到一个优于两者的解决方案,例如使用map.find()的某些变体,将前一个迭代器作为提示(类似于map.emplace_hint(...))——但我找不到这样的函数。问题:是否可以直接使用STL或某些兼容库将两种解决方案的性能特征结合起来?请注意,

c++ - 最近点算法 |如何改进?

我写了一个k-means聚类算法和一个颜色量化算法。它们在结果方面按预期工作,但我想让它们更快。在这两种实现中我都需要解决一个问题:在3D空间中有两个点数组,然后对于第一个数组中的每个点,你需要从第二个数组中找到最近的点。我这样做:size_tclosest_cluster_index;doublex_dif,y_dif,z_dif;doubleold_distance;doublenew_distance;for(autopoint=points.begin();point!=points.end();point++){//FIX//assuggestedbyjuvian//K=1i

c++ - 结束(结束后)迭代器的 STL 迭代器重新验证?

请参阅有关尾后迭代器失效的相关问题:this,this.这更多是一个设计问题,即是否存在(在STL或其他地方)past-the-end迭代器“重新验证”这样的概念?我的意思和用例:假设算法需要“跟踪”容器(例如队列)。它遍历容器直到到达end(),然后暂停;独立于此,程序的另一部分将更多项目放入队列中。算法如何在保持之前的尾端迭代器(称之为tailIt)的同时,有效地告诉“有更多的项目被排队”?(这意味着它能够检查tailIt==container.end()still,并且如果那是假的,则得出结论tailIt是现在有效并指向插入的第一个元素)。请不要将问题视为“不,没有”——我正在寻

c++ - 如果方法是const,如何找到 vector 的中值?

我创建了一个名为Collect的方法,它将一堆值添加到vector中(如下所示)voidMedian::Collect(doubledatum){myVector.push_back(datum);}我需要创建一个方法来计算我在上述方法中收集到的vector中的所有值的中位数。函数定义写在下面/*Calculatesthemedianofthedata(datum)fromtheCollectmethod.*/doubleMedian::Calculate()const{}所以我知道我首先需要对vector进行排序才能找到中位数。以下是我的尝试:doubleMedian::Calcul

c++ - SPOJ 处的 CODE1 - 无法解决

我正在尝试解决SPOJ上的SecretCode问题,这显然是一道数学题。Thefullproblem对于那些懒得去看书的人来说,是这样的:a0,a1,a2,...,an-sequenceofNnumbersB-aComplexNumber(hasbothrealandimaginarycomponents)X=a0+a1*B+a2*(B^2)+a3*(B^3)+...+an*(B^n)因此,如果给定B和X,您应该找到a0、a1、..an。我不知道如何或从哪里开始,因为连N都不知道,只有X和B。这个问题不像用B表示一个数字那么简单,因为B是一个复数。如何解决?

c++ - φ(n) = (p-1)(q-1) p 和 q 是两个大数找到 e 使得 gcd(e,φ(n)) = 1

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭11年前。φ(n)=(p-1)(q-1)p和q是两个大数找到满足gcd(e,φ(n))=1的e将p和q视为一个非常大的素数(Bigint)。我想为此找到一个有效的解决方案。[编辑]我可以用蛮力法解决这个问题。但由于数字太大,我需要更有效的解决方案。还有1

c++ - 使用 STL map 搜索位于矩形区域中的点?

我有很多x,y点,每个x,y点都有一些与之相关的额外数据。我将把这些额外数据存储在一个结构中。我的应用程序要求给定任何一个点,我必须找出在该点周围的矩形区域内还有多少其他点(该点位于矩形的中心)。我想到的一个逻辑是将所有x点存储为mapA中的键,将所有y点存储为另一个mapB中的键。映射A将x作为键,y值作为值。MapB将以y作为键,将关联的结构作为值。这样,如果给定的点是(10.5,20.6),我可以使用upper_bound(10.5+RECTANGLE_WIDTH)和lower_bound(10.5-RECTANGLE_WIDTH)找到位于矩形内的x值范围以及对应的y值,找出y值