재배치 불평등


10

배경

재배치 불평등 번호를 재 배열을 기반으로하는 불평등이다. 길이가 같은 두 개의 숫자 목록 x 0 , x 1 , x 2 ... x n-1 및 y 0 , y 1 , y 2 ... y n-1 이 같은 길이 인 경우, 여기서 목록에서 숫자를 다시 정렬 할 수 있습니다. 합계를 최대화하는 방법은 0 x 0 + x 1 y 1 + x 2 y 2 + ... + x n-1 y n-1 을 최대화하는 것 입니다. 감소하지 않는 순서.

Wikipedia 기사를 읽으 십시오.

직무

STDIN에서 입력을받는 프로그램이나 같은 길이의 숫자로 된 2 개의 배열 (또는 관련 컨테이너)을 허용하는 함수를 작성합니다.

2 개의 배열 (a 및 b)을 허용하는 함수를 작성한다고 가정하면 두 번째 배열 (b)의 숫자를 재정렬하여 최대화 할 수있는 방법을 찾을 수 있습니다.

a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+...+a[n-1]*b[n-1]

이 경우, 배열 b가 [1 0 , 2 1 , 2 2 , 3 3 , 3 4 ] 인 경우 (명확성을 나타냄),

[1 0 2 1 2 2 3 3 3 4 ]

[1 0 , 2 1 , 2 2 , 3 4 , 3 3 ], (두 3을 교환)

[1 0 , 2 2 , 2 1 , 3 3 , 3 4 ] (두 개 2 개 교체)

[1 0 , 2 2 , 2 1 , 3 4 , 3 3 ] (두 3을 교환하고 2를 교환)

다른 배열로 간주됩니다. 원래 배열 자체도 합을 최대화하면 가능한 재 배열로 계산됩니다.

STDIN 입력의 경우, 배열의 길이가 배열 앞에 제공되거나 (사용하도록 상태를 지정하십시오) 배열이 다른 행에 제공된다고 가정하십시오 (상태도 표시).

다음은 4 가지 가능한 입력입니다 (편의상).

5 1 1 2 2 2 1 2 2 3 3 (length before arrays)

1 1 2 2 2 1 2 2 3 3 (the 2 arrays, concatenated)

1 1 2 2 2
1 2 2 3 3 (the 2 arrays on different lines)

5
1 1 2 2 2
1 2 2 3 3 (length before arrays and the 2 arrays on different lines)

출력의 경우, 답변을 리턴하거나 (함수를 작성하는 경우) 답변을 STDOUT에 인쇄 할 수 있습니다. 보다 편리한 경우 응답 모드 10 9 +7 (0에서 10 9 +6까지) 을 출력하도록 선택할 수 있습니다 .

테스트 사례 (및 설명) :

[1 1 2 2 2] [1 2 2 3 3] => 24

처음 2 개의 항목은 1과 2 여야합니다. 마지막 3 개의 항목은 2, 3 및 3입니다. 처음 2 개의 항목과 마지막 2 개의 항목 사이에 2를 배열하는 방법에는 두 가지가 있습니다. 처음 2 개의 항목 중에서 2 가지 방법으로 항목을 재정렬 할 수 있습니다. 마지막 2 개의 항목 중에서 6 가지 방법으로 항목을 재정렬 할 수 있습니다.

[1 2 3 4 5] [6 7 8 9 10] => 1

배열에는 1 가지 방법 만 있습니다.

[1 1 ... 1 1] [1 1 ... 1 1] (10000 numbers) => 10000! or 531950728

두 번째 배열의 가능한 모든 순열이 유효합니다.

Dennis의 테스트 사례 : Pastebin => 583159312 (mod 1000000007)

채점 :

이것은 코드 골프이므로 최단 답변이 이깁니다.

동점 인 경우, 제출 시점에 관계가 끊어지며 이전 제출에 유리합니다.

필기 해:

용기가 분류되지 않았을 수 있습니다.

컨테이너의 정수는 0이거나 음수 일 수 있습니다.

프로그램은 적당한 크기의 배열 (길이 약 10000)에 대해 충분히 빨리 (최대 1 시간) 실행해야합니다.

수학 스택 교환에 대한이 질문 에서 영감을 얻었습니다 .


2
배열 당 10000 개의 요소가 포함 된 테스트 사례를 제공하여 코드가 올바르게 작동하고 충분히 빠른지 확인할 수 있습니다.
데니스

1
이 예에서는 두 번째 어레이 [1_0, 2_2, 2_1, 3_4, 3_3] 교체를 위해 제공합니다 (두 개의 2를 교체하고 두 개의 3을 교체)
Willem

[. . .]plz 응답 과 같은 입력을
받습니까

함수를 제출하면 두 개의 별도 인수를 취해야합니까, 아니면 배열 배열을 사용할 수 있습니까?
Dennis

글쎄, 배열의 배열은 괜찮아 보이고 도전에 너무 영향을 미치지 않습니다. 테스트 케이스에서 작업하겠습니다.
Element118

답변:


4

CJam, 30 26 바이트

q~](/:$_za+{e`0f=:m!:*}//*

CJam 통역사 에서 온라인으로 사용해보십시오 .

이 테스트 사례 를 1 초 이내에 완료 합니다 .

$ time cjam <(echo 'q~](/:$_za+{e`0f=:m!:*}%)\:*\/N') < test-large.in | md5sum
5801bbf8ed0f4e43284f7ec2206fd3ff  -

real    0m0.308s
user    0m0.667s
sys     0m0.044s

온라인 통역사에서 실행하는 데 10 초 미만이 소요됩니다.

연산

결과는 A 의 순서에 의존하지 않으므로 정렬 된 것으로 가정 할 수 있습니다. 이것은 B를 의미 , 최대 내적을 얻기 위해 도 정렬해야합니다.

이제, 만약 R 1 , ..., R , N 의 주행면의 길이가 분류되어 가, Πr의 K ! 여전히 오름차순으로 나타나는 A 요소의 다른 재 배열 .

마찬가지로, 만약 s의 (1) , S ... N 정렬의 런 길이이다 B 있다 Πs의 K ! B 의 원소의 다른 재 배열여전히 오름차순으로 나타나는 .

그러나 이것은 모든 페어링을 여러 번 계산합니다. 우리는 정렬의 대응하는 요소의 쌍 맡으면 하고 정렬 B를 정의를 t 1 , t ... N을 생성 어레이의 런 길이 Πt의 K !위에서 언급 한 승수입니다.

따라서 원하는 결과는 (∏r k !) × (∏s k !) ÷ (∏t k !)입니다. 입니다.

암호

 q~                          Read and evaluate all input.
   ]                         Wrap the resulting integers in an array.
    (                        Shift out the first (length).
     /                       Split the remainder into chunks of that length.
      :$                     Sort each chunk.
        _z                   Push a copy and transpose rows with columns.
                             This pushes the array of corresponding pairs.
          a+                 Wrap in array and concatenate (append).
            {          }/    For A, B, and zip(A,B):
             e`                Perform run-length encoding.
               0f=             Select the runs.
                  :m!          Apply factorial to each.
                     :*        Reduce by multiplication.
                         /   Divide the second result by the third.
                          *  Multiply the quotient with the first result.

6

Pyth, 29 28 바이트

M/*FPJm*F.!MhMrd8aFCB,SGSHeJ

Pyth Compiler 에서 온라인으로 사용해보십시오 .

연산

결과는 A 의 순서에 의존하지 않으므로 정렬 된 것으로 가정 할 수 있습니다. 이것은 B를 의미 , 최대 내적을 얻기 위해 도 정렬해야합니다.

이제, 만약 R 1 , ..., R , N 의 주행면의 길이가 분류되어 가, Πr의 K ! A 의 요소의 다른 재배치여전히 오름차순으로 나타나는 .

마찬가지로, 만약 s의 (1) , S ... N 정렬의 런 길이이다 B 있다 Πs의 K ! 여전히 오름차순으로 나타나는 B 요소의 다른 재 배열 .

그러나 이것은 모든 페어링을 여러 번 계산합니다. 우리는 정렬의 대응하는 요소의 쌍 맡으면 하고 정렬 B를 정의를 t 1 , t ... N을 생성 어레이의 런 길이 Πt의 K ! 위에서 언급 한 승수입니다.

따라서 원하는 결과는 (∏r k !) × (∏s k !) ÷ (∏t k !) 입니다.

암호

M/*FPJm*F.!MhMrd8aFCB,SGSHeJ

M                             Define g(G,H):
                      SGSH      Sort G and H.
                     ,          For the pair of the results.
                   CB           Bifurcated zip (C).
                                This returns [[SG, SH], zip([SG, SH])].
                 aF             Reduce by appending.
                                This returns [SG, SH, zip([SG, SH])].
      m                         Map; for each d in the resulting array:
              rd8                 Perform run-length encoding on d.
            hM                    Mapped "head". This returns the lengths.
         .!M                      Mapped factorial.
       *F                         Reduce by multiplication.
     J                          Save the result in J.
    P                           Discard the last element.
  *F                            Reduce by multiplication.
 /                  
                          eJ    Divide the product by the last element of J.
                                Return the result of the division.

확인

위의 코드 와이 무차별 대입 방식으로 해결 한 길이 6의 100 가지 테스트 사례를 의사 무작위로 생성했습니다.

Ml.Ms*VGZ.pH

M             Define g(G,H) (or n(G,H) on second use):
         .pH    Compute all permutations of H.
  .M            Filter .pH on the maximal value of the following;
                 for each Z in .pH:
     *VGZ         Compute the vectorized product of G and Z.
    s             Add the products.
                  This computes the dot product of G and Z.
 l              Return the length of the resulting array.

결과는 다음과 같습니다.

$ cat test.in
6,9,4,6,8,4,5,6,5,0,8,2
0,7,7,6,1,6,1,7,3,3,8,0
3,6,0,0,6,3,8,2,8,3,1,1
2,3,0,4,0,6,3,4,5,8,2,4
9,1,1,2,2,8,8,1,7,4,9,8
8,3,1,1,9,0,2,8,3,4,9,5
2,0,0,7,7,8,9,2,0,6,7,7
0,7,4,2,2,8,6,5,0,5,4,9
2,7,7,5,5,6,8,8,0,5,6,3
1,7,2,7,7,9,9,2,9,2,9,8
7,2,8,9,9,0,7,4,6,2,5,3
0,1,9,2,9,2,9,5,7,4,5,6
8,4,2,8,8,8,9,2,5,4,6,7
5,2,8,1,9,7,4,4,3,3,0,0
9,3,6,2,5,5,2,4,6,8,9,3
4,2,0,6,2,3,5,3,6,3,1,4
4,8,5,2,5,0,5,1,2,5,9,5
6,8,4,4,9,5,9,5,4,2,8,7
8,9,8,1,2,2,9,0,5,6,4,9
4,7,6,8,0,3,7,7,3,9,8,6
7,5,5,6,3,9,3,8,8,4,8,0
3,8,1,8,5,6,6,7,2,8,5,3
0,9,8,0,8,3,0,3,5,9,5,6
4,2,7,7,5,8,4,2,6,4,9,4
3,5,0,8,2,5,8,7,3,4,5,5
7,7,7,0,8,0,9,8,1,4,8,6
3,9,7,7,4,9,2,5,9,7,9,4
4,5,5,5,0,7,3,4,0,1,8,2
7,4,4,2,5,1,7,4,7,1,9,1
0,6,2,5,4,5,1,8,0,8,9,9
3,8,5,3,2,1,1,2,2,2,8,4
6,1,9,1,8,7,5,6,9,2,8,8
6,2,6,6,6,0,2,7,8,6,8,2
0,7,1,4,5,5,3,4,4,0,0,2
6,0,1,5,5,4,8,5,5,2,1,6
2,6,3,0,7,4,3,6,0,5,4,9
1,4,8,0,5,1,3,2,9,2,6,5
2,7,9,9,5,0,1,5,6,8,4,6
4,0,1,3,4,3,6,9,1,2,7,1
6,5,4,7,8,8,6,2,3,4,1,2
0,3,6,3,4,0,1,4,5,5,5,7
5,4,7,0,1,3,3,0,2,1,0,8
8,6,6,1,6,6,2,2,8,3,2,2
7,1,3,9,7,4,6,6,3,1,5,8
4,8,3,3,9,1,3,4,1,3,0,6
1,4,0,7,4,9,8,4,2,1,0,3
0,4,1,6,4,4,4,7,5,1,4,2
0,0,4,4,9,6,7,2,7,7,5,4
9,0,5,5,0,8,8,9,5,9,5,5
5,7,0,4,2,7,6,1,1,1,9,1
3,1,7,5,0,3,1,4,0,9,0,3
4,4,5,7,9,5,0,3,7,4,7,5
7,9,7,3,0,8,4,0,0,3,1,0
2,4,4,3,1,2,5,2,9,0,8,5
4,8,7,3,0,0,9,3,7,3,0,6
8,9,1,0,7,7,6,0,3,1,8,9
8,3,1,7,3,3,6,1,1,7,6,5
6,5,6,3,3,0,0,5,5,0,6,7
2,4,3,9,7,6,7,6,5,6,2,0
4,8,5,1,8,4,4,3,4,5,2,5
7,5,0,4,6,9,5,0,5,7,5,5
4,8,9,5,5,2,3,1,9,7,7,4
1,5,3,0,3,7,3,8,5,5,3,3
7,7,2,6,1,6,6,1,3,5,4,9
9,7,6,0,1,4,0,4,4,1,4,0
3,5,1,4,4,0,7,1,8,9,9,1
1,9,8,7,4,9,5,2,2,1,2,9
8,1,2,2,7,7,6,8,2,3,9,7
3,5,2,1,3,5,2,2,4,7,0,7
9,6,8,8,3,5,2,9,8,7,4,7
8,8,4,5,5,1,5,6,5,1,3,3
2,6,3,5,0,5,0,3,4,4,0,5
2,2,7,6,3,7,1,4,0,3,8,3
4,8,4,2,6,8,5,6,2,5,0,1
7,2,4,3,8,4,4,6,5,3,9,4
4,6,1,0,6,0,2,6,7,4,9,5
6,3,3,4,6,1,0,8,6,1,7,5
8,3,4,2,8,3,0,1,8,9,1,5
9,6,1,9,1,1,8,8,8,9,1,4
3,6,1,6,1,4,5,1,0,1,9,1
6,4,3,9,3,0,5,0,5,3,2,4
5,2,4,6,1,2,6,0,1,8,4,0
3,5,7,6,3,6,4,5,2,8,1,5
6,3,6,8,4,2,7,1,5,3,0,6
9,1,5,9,9,1,1,4,5,7,3,0
1,6,7,3,5,8,6,5,5,2,6,0
2,8,8,6,5,5,2,3,8,1,9,8
0,4,5,3,7,6,2,5,4,3,2,5
5,1,2,3,0,3,4,9,4,9,4,9
5,8,2,2,0,2,4,1,1,7,0,3
0,6,0,0,3,6,3,6,2,2,2,9
2,4,8,1,9,4,0,8,8,0,4,7
3,9,1,0,5,6,8,8,2,5,2,6
5,3,8,9,1,6,5,9,7,7,6,1
8,6,9,6,1,1,6,7,7,3,2,2
7,2,1,9,8,8,5,3,6,3,3,6
9,9,4,8,7,9,8,6,6,0,3,1
8,3,0,9,1,7,4,8,0,1,6,2
8,2,6,2,4,0,2,8,9,6,3,7
1,0,8,5,3,2,3,7,1,7,8,2
$ while read; do
> pyth -c 'M/*FPJm*F.!MhMrd8aFCB,SGSHeJMl.Ms*VGZ.pHAc2Q,gGHnGH' <<< "$REPLY"
> done < test.in
[4, 4]
[4, 4]
[8, 8]
[4, 4]
[8, 8]
[2, 2]
[4, 4]
[4, 4]
[4, 4]
[36, 36]
[2, 2]
[8, 8]
[24, 24]
[8, 8]
[2, 2]
[2, 2]
[6, 6]
[2, 2]
[8, 8]
[2, 2]
[12, 12]
[2, 2]
[8, 8]
[12, 12]
[4, 4]
[12, 12]
[4, 4]
[6, 6]
[8, 8]
[8, 8]
[6, 6]
[4, 4]
[48, 48]
[8, 8]
[4, 4]
[1, 1]
[4, 4]
[4, 4]
[8, 8]
[4, 4]
[12, 12]
[2, 2]
[96, 96]
[2, 2]
[4, 4]
[2, 2]
[6, 6]
[24, 24]
[24, 24]
[48, 48]
[4, 4]
[8, 8]
[12, 12]
[8, 8]
[4, 4]
[2, 2]
[24, 24]
[16, 16]
[2, 2]
[8, 8]
[24, 24]
[4, 4]
[24, 24]
[4, 4]
[12, 12]
[8, 8]
[12, 12]
[4, 4]
[8, 8]
[4, 4]
[16, 16]
[4, 4]
[8, 8]
[8, 8]
[4, 4]
[4, 4]
[4, 4]
[4, 4]
[72, 72]
[24, 24]
[4, 4]
[4, 4]
[4, 4]
[2, 2]
[12, 12]
[4, 4]
[8, 8]
[4, 4]
[36, 36]
[6, 6]
[12, 12]
[8, 8]
[4, 4]
[2, 2]
[8, 8]
[24, 24]
[6, 6]
[1, 1]
[2, 2]
[2, 2]

제출물이 속도 요구 사항을 충족하는지 확인하기 위해이 테스트 사례로 실행했습니다 .

$ time pyth -c 'M/*FPJm*F.!MhMrd8aFCB,SGSHeJAc2QgGH' < test-large.in | md5sum
5801bbf8ed0f4e43284f7ec2206fd3ff  -

real    0m0.233s
user    0m0.215s
sys     0m0.019s

2

Matlab, 230 바이트

편집 : dennis의 테스트 사례와 일치하도록 많은 것들이 수정되었으며, nil 값으로 인해 nnz가 numel로 대체되었습니다.

f=1;t=-1;q=1;a=sort(input(''));b=sort(input(''));for i=unique(a)c=b(find(a==i));r=numel(c(c==t));f=f*factorial(numel(c))*sum(arrayfun(@(u)nchoosek(max(q,r),u),0:min(q,r)));z=c(end);y=numel(c(c==z));q=(t==z)*(q+r)+(t~=z)*y;t=z;end,f

실행

[2 2 1 2 1]
[3 2 3 2 1]

f =

    24

데니스의 테스트 케이스 :

   A = importdata('f:\a.csv'); for i=1:100,a=sort(A(i,1:6));b=sort(A(i,7:12));
   f=1;t=-1;q=1;for i=unique(a)c=b(find(a==i));r=numel(c(c==t));f=f*factorial(numel(c))*sum(arrayfun(@(u)nchoosek(max(q,r),u),0:min(q,r)));z=c(end);y=numel(c(c==z));q=(t==z)*(q+r)+(t~=z)*y;t=z;end;
   disp(f);end

출력 :

 4

 4

 8

 4

 8

 2

 4

 4

 4

36

 2

 8

24

 8

 2

 2

 6

 2

 8

 2

12

 2

 8

12

 4

12

 4

 6

 8

 8

 6

 4

48

 8

 4

 1

 4

 4

 8

 4

12

 2

96

 2

 4

 2

 6

24

24

48

 4

 8

12

 8

 4

 2

24

16

 2

 8

24

 4

24

 4

12

 8

12

 4

 8

 4

16

 4

 8

 8

 4

 4

 4

 4

72

24

 4

 4

 4

 2

12

 4

 8

 4

36

 6

12

 8

 4

 2

 8

24

 6

 1

 2

 2

글쎄, 그것은 문제를 해결하므로 입력이 너무 중요하지 않아야합니다.
Element118

1

C ++, 503 바이트

(골프가 아닌 언어로 재미있게)

#import<iostream>
#import<algorithm>
#define U 12345
#define l long long
using namespace std;int N,X=1,Y=1,Z=1,x[U],y[U],i=1;l p=1,M=1000000007,f[U];l e(l x,int y){return y?y%2?(x*e(x,y-1))%M:e((x*x)%M,y/2):1;}main(){for(f[0]=1;i<U;i++)f[i]=(f[i-1]*i)%M;cin>>N;for(i=0;i<N;i++)cin>>x[i];for(i=0;i<N;i++)cin>>y[i];sort(x,x+N);sort(y,y+N);for(i=1;i<N;i++)x[i]^x[i-1]?p=p*f[X]%M,X=1:X++,y[i]^y[i-1]?p=p*f[Y]%M,Y=1:Y++,x[i]^x[i-1]|y[i]^y[i-1]?p=p*e(f[Z],M-2)%M,Z=1:Z++;cout<<p*f[X]%M*f[Y]%M*e(f[Z],M-2)%M;}

언 골프 버전 :

#include <cstdio>
#include <algorithm>
#define MOD 1000000007
using namespace std;
int N; // number of integers
int x[1000010]; // the 2 arrays of integers
int y[1000010];
long long product = 1;
long long factorial[1000010]; // storing factorials mod 1000000007
long long factorialInv[1000010]; // storing the inverse mod 1000000007
long long pow(long long x, int y) {
    if (y == 0) return 1;
    if (y == 1) return x;
    if (y%2 == 1) return (x*pow(x, y-1))%MOD;
    return pow((x*x)%MOD, y/2);
}
int main(void) {
    //freopen("in.txt", "r", stdin); // used for faster testing
    //precomputation
    factorial[0] = factorial[1] = 1;
    for (int i=2;i<=1000000;i++) {
        factorial[i] = (factorial[i-1]*i)%MOD;
        factorialInv[i] = pow(factorial[i], MOD-2);
    }
    // input
    scanf("%d", &N);
    for (int i=0;i<N;i++) {
        scanf("%d", &x[i]);
    }
    for (int i=0;i<N;i++) {
        scanf("%d", &y[i]);
    }
    // sort the 2 arrays
    sort(x, x+N);
    sort(y, y+N);
    int sameX = 1;
    int sameY = 1;
    int sameXY = 1;
    for (int i=1;i<N;i++) {
        if (x[i]==x[i-1]) {
            sameX++;
        } else {
            product *= factorial[sameX];
            product %= MOD;
            sameX = 1;
        }
        if (y[i]==y[i-1]) {
            sameY++;
        } else {
            product *= factorial[sameY];
            product %= MOD;
            sameY = 1;
        }
        if (x[i]==x[i-1] && y[i]==y[i-1]) {
            sameXY++;
        } else {
            product *= factorialInv[sameXY];
            product %= MOD;
            sameXY = 1;
        }
    }
    product *= factorial[sameX];
    product %= MOD;
    product *= factorial[sameY];
    product %= MOD;
    product *= factorialInv[sameXY];
    product %= MOD;
    printf("%lld\n", product);
    return 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.