Python 如何排列一个数组,使尽可能多的整数移动到一个较小整数所在的位置?

Python 如何排列一个数组,使尽可能多的整数移动到一个较小整数所在的位置?,python,arrays,algorithm,Python,Arrays,Algorithm,我试图理解一个算法/逻辑问题的解决方案。问题陈述如下: 您将获得一个整数数组。Vasya可以排列(改变顺序)它的整数。他想这样做,使尽可能多的整数成为一个小整数所在的位置。帮助Vasya找到此类整数的最大数目。例如,如果给我们一个数组[10,20,30,40],我们可以将它排列成[20,40,10,30]。然后在第一个和第二个位置上,整数变大了(20>10,40>20),而在第三个和第四个位置上没有变大,所以对于这个排列,Vasya想要最大化的数字等于2。帮助Vasya排列整数,使新数组中整数大

我试图理解一个算法/逻辑问题的解决方案。问题陈述如下:

您将获得一个整数数组。Vasya可以排列(改变顺序)它的整数。他想这样做,使尽可能多的整数成为一个小整数所在的位置。帮助Vasya找到此类整数的最大数目。例如,如果给我们一个数组[10,20,30,40],我们可以将它排列成[20,40,10,30]。然后在第一个和第二个位置上,整数变大了(20>10,40>20),而在第三个和第四个位置上没有变大,所以对于这个排列,Vasya想要最大化的数字等于2。帮助Vasya排列整数,使新数组中整数大于原始数组的位置数最大

输入:


  • 第一行包含一个整数,也许一个直观的例子可以帮助:

    如果您的数组已经排序,您将得到如下结果:

     [1, 2, 3, 4, 5]
    
    如果将其向右移动一个位置,则除最后一个之外的所有数字都将替换为较大的数字。因此,n-1是您可以进行的最大替换次数,因为最大的替换次数不能被较小的替换次数替换

     [1, 2, 3, 4, 5]
         |  |  |  |     
        [1, 2, 3, 4, 5]  
    
    如果数组未排序,则替换发生在不同的位置,但有相同数量的对

    如果您有一个重复的号码,则将少一个较大/较小的替换号码。因此,我们最终得到了n-2个这样的替换(其中2是最大重复次数)

    这可以通过以下事实来解释:为了实现第n次替换,您必须能够执行第(n-1)次替换,每个替换都需要较小的值。所以你需要一个小1的值,一个小2的值。。。具有n-1个较小值的值。每个重复值都会打断该序列,因此具有2个重复值(即相同值3次)的7个元素的列表类似于5个元素的列表,可以有4个替换(7-3)

    但是,如果有两个不同的元素重复,则只会遇到这两个元素中最坏的情况,因为可以在额外元素之间再次执行替换:

    [1, 2, 3, 3, 4, 5, 5, 5, 6]
        |  |     |  |        |                  5 replacements
       [1, 2, 3, 3, 4, 5, 5, 5, 6] 
    
             [3, 5, 5]
                 |                              1 replacements
                [3, 5, 5]
     
         For 9 elements with 3 max repeated =   6 replacements
    
         9-3 = 6 = N - maxRepeat
    

    这真的不是一个编程问题。这更像是一个离散的数学问题,除其他外,需要理解排列如何分解为不同的循环。也许继续问会更好。我投票结束这个问题,因为这个问题不是关于编程的,但是的,LP对偶性有点像魔术一样(这个例子是一个具体的应用程序)。
    [1, 2, 3, 3, 4, 5, 5, 5, 6]
        |  |     |  |        |                  5 replacements
       [1, 2, 3, 3, 4, 5, 5, 5, 6] 
    
             [3, 5, 5]
                 |                              1 replacements
                [3, 5, 5]
     
         For 9 elements with 3 max repeated =   6 replacements
    
         9-3 = 6 = N - maxRepeat