这是一个面试问题,我无法解决自己。有人可以点亮她吗?
问题:假设你有聊天客户端,在文本框中你有一个笑脸(它已经存在)。现在你想要那个笑脸N次,只允许两个操作复制和粘贴。结果必须是N个表情不多于少。复制基本上是^ a + ^ c。您必须在给定时间复制文本框中的所有笑脸。复制是一次击键,粘贴是一次击键。为此问题编写算法/程序。复杂性会是什么?
答案 0 :(得分:5)
无论N的笑脸数量是多少,因此将因子N纳入素数的乘积。然后,对于分解中的每个素数,您需要执行一次复制和p-1次粘贴。如果" copy"这是可能的最小操作次数。意味着你必须复制整个表情符号串。操作总数是N因式分解中所有主要因素的总和。
答案 1 :(得分:2)
user2566092's answer是正确的,但声明
这是可能的最小操作次数
声称没有证据。这是一个正式的理由。
设n为表情的目标数量。配置(r,k)由结果中的表情符号r和剪贴板上的表情符号数k组成。初始配置为(1,0)。从(r,k)开始,配置(r,r)[copy]和(r + k,k)[paste]可以在一次击键中到达。
以下引理意味着,在复制后,结果中的表情数量均匀划分为n。
引理假设g除以r和k(g | r和g | k)。从(r,k)可到达的每个配置(r',k')满足g | r'和g | k'。
感应证明。如果下一步是副本,则到(r,r),然后g | r和g | r。如果下一步是粘贴,则为(r + k,k),然后g | r + k和g | k。
现在我们可以证明主要的主张。
定理从(1,0)到某些(n,k)的最小步数,其中k是任意的,是p1 + p2 + ... + pm,其中n = p1 p2。 .. pm是一个主要的分解。
证明 user2566092覆盖了上限:对于i从1到m,复制一次并粘贴pi - 1次。当n = 1时,下限是显而易见的。否则,最好的第一个动作显然是副本,(1,1)。我们通过归纳显示从(1,1)到(n,k)的最小步数是p1 + p2 + ... + pm - 1.
从(1,1),通过引理,我们所能做的就是粘贴直到r除以n。修复一个特定的r | n。从(r,r)到(n,n)和从(1,1)到(n / r,n / r)的最佳动作序列显然是相同的。通过置换素数而不失一般性,假设r = p1 p2 ... pj。由于a,b> = 2的b> = a + b,因此r> = p1 + p2 + ... + pj。如果r < n,则归纳假设的总成本至少为r + pj + 1 + pj + 2 + ... + pm - 1> = p1 + p2 + ... + pj - 1.如果r = n,那么总费用是n - 1> = p1 + p2 + ... + pm - 1.
答案 2 :(得分:0)
2 * 2log(N)。 每次重复所有内容,直到您不再需要完整集。然后你只能复制列表的一部分。
E.g。 7个表情:
1复制一切
2复制一切
仅复制4份
有7。
答案 3 :(得分:0)
以下是针对上述问题的程序。在最坏的情况下,该解决方案的时间复杂度为O(n)。最坏的情况发生在给定数字为素数时。
#include <iostream>
using namespace std;
int main()
{
int smiles;
cin>>smiles;
int ans=0;
for(int i=2;i<=smiles;i++)
{
while(smiles%i==0)
{
ans+=i;
smiles/=i;
}
}
cout<<ans<<"\n";
return 0;
}