Python中的正面不同的命令

时间:2016-07-07 19:12:12

标签: python algorithm greedy

此代码为n=2提供了错误的输出,而且速度很慢。

如何使这段代码能够更有效地找到更多正面不同的数字呢?

TASK - 将给定的正整数n表示为成对的总和 尽可能明显的正整数。

输出:首先包含一个整数k。第二行包含k个正不同的正数加起点,总计为n

Sample Input:

8

Output:

3

1 2 5

n=int(input())
p=[]
i=1
while(i<=n):
      if (n-i) not in p:
          p.append(i)
      n-=i
      i+=1
print(len(p))
print(*p)

3 个答案:

答案 0 :(得分:4)

您可以通过分析解决问题。如果您尝试访问的号码为N,则答案将始终为

1+2+3+ ... +n + r = N

其中n是最大可能的数字n < r。例如,取N=8,并考虑n

的可能值
n   sum(1..n)  r
0       0      8
1       1      7
2     1+2=3    5
3    1+2+3=6   2    // too high, n is not less than r

因此,当N为8时,n为2而r为5,给出1 + 2 + 5的答案。

所以问题变成,鉴于N的价值,我们如何计算n。第一步是要注意,1到n之和由公式

给出
1+2+3+ ... +n = n(n+1)/2

将其插入第一个等式

n(n+1)/2 + r = N

使用n < r的事实,我们可以将其重写为

n(n+1)/2 + n < N

enter image description here

这就是你需要实现的答案。例如,如果N为2,则公式显示为n < 1,表示n为0且r为2.如果N为8,则n < 2.77,表示n为2,r为5。

答案 1 :(得分:0)

我不确定你的代码是否有其他缺陷,但我可以看到有类似于n = 2的测试用例会导致失败(例如,我相信n = 9)。试试if ((n-i) not in p and n-i != i)。你失败n = 2,因为它看到i = 1不在p中,但你就是要把它放进去。

答案 2 :(得分:0)

找到序列的一种方法是有两个起点:N和m,其中N是我们试图达到的数字,m从1开始。

接下来,我们将m增加1,将其加到序列中并减少N.通过将N减少m并在N <= m * 2时停止来达到解。

例如,如果我们想要达到的数字是3

N = 3

然后,

s={} #  array to store pairwise distinct positive integers
k = 3 # k = N at the beginning 
m = 1  #  always starts at 1 
m*2 = 2

 k is not <= m*2

我们将 m 添加到数组中,从 k 中减去 m ,将 1 添加到 m 并再次重复相同的过程。

s = {1}
k = k - m = 3 - 1 = 2
m = 1 + m = 1 + 1 = 2

现在,

m*2 = 4

 k <= m*2  

我们将 k 添加到我们的数组中,我们完成了。

 s = {1, 2}

这是python中执行相同操作的代码。

def optimal_summands(n):

 summands = [] # array to store pairwise distinct positive integers
 k = n # marked the upper part
 m = 1 # marked the lower part

 if n == 2 or n == 1:
     summands.append(n)
 else:
     for i in range(1,k):
         if k <= 2*m:
             summands.append(k)
             break
         else:
             summands.append(m)
             k = k - m
             m = m + 1

 return summands