使用最少击键次数的N个表情

时间:2014-08-15 15:48:14

标签: algorithm

这是一个面试问题,我无法解决自己。有人可以点亮她吗?

问题:假设你有聊天客户端,在文本框中你有一个笑脸(它已经存在)。现在你想要那个笑脸N次,只允许两个操作复制和粘贴。结果必须是N个表情不多于少。复制基本上是^ a + ^ c。您必须在给定时间复制文本框中的所有笑脸。复制是一次击键,粘贴是一次击键。为此问题编写算法/程序。复杂性会是什么?

4 个答案:

答案 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;
}