-1

このコードはspojで間違った答えを得てい ます。より強力なテスト ケースでコードをチェックしたいです。助けていただければ幸いです。

SUM 問題は次のように定式化できます: 整数値の 4 つのリスト A、B、C、D が与えられた場合、A x B x C x D に属する 4 つ組 (a、b、c、d ) の数を計算すると、a + b + c + d = 0 . 以下では、すべてのリストのサイズが同じ n であると仮定します。

入力

入力ファイルの最初の行には、リストのサイズ n が含まれています (この値は最大 4000 まで可能です)。次に、それぞれ A、B、C、および D に属する 4 つの整数値 (絶対値は 2^28 の大きさ) を含む n 行があります。

入力:

6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45

出力:

5

#include<stdio.h>
#include<stdlib.h>

int binarys(int a,long int b[],int low,int up,int k)
{
    int par;

    if(low <= up) {
        par = partition(low,up,b);
        if(b[par] + a == 0) {
            k = k + 1;
            k = binarys(a,b,low,par-1,k);
            k = binarys(a,b,par+1,up,k);
        }
        if(b[par] > -1*a)
            k = binarys(a,b,low,par-1,k);
        if(b[par] < -1*a)
            k = binarys(a,b,par+1,up,k);
    }
    return k;
}

int partition(int low,int up,int b[])
{
    int i;
    int j;
    int m;
    int a;

    j = low - 1;
    m = b[up];

    for(i=low; i < up; i++) {
        if(b[i] <= m ) {
            j++;
            a = b[i];
            b[i] = b[j];
            b[j] = a;
        }
    }
    a = b[j+1];
    b[j+1] = b[up];
    b[up] = a;

    return j + 1;
}

int main()
{
    long int *A = NULL;
    long int *B = NULL;
    long int *C = NULL;
    long int *D = NULL;
    long int *a = NULL;
    long int *b = NULL;
    int n;
    int i;
    int j;
    int k;
    int l;
    int sum;

    scanf("%d",&n);

    k = 0;
    sum = 0;
    A = (long int*)malloc(n*sizeof(long int));
    B = (long int*)malloc(n*sizeof(long int));
    C = (long int*)malloc(n*sizeof(long int));
    D = (long int*)malloc(n*sizeof(long int));
    a = (long int*)malloc(n*n*sizeof(long int));
    b = (long int*)malloc(n*n*sizeof(long int));

    for(i=0; i < n; i++) {
        scanf("%d%d%d%d",&A[i],&B[i],&C[i],&D[i]);
    }

    for(i=0; i < n; i++) {
        for(j=0; j < n; j++) {
            a[k] = A[i] + B[j];
            b[k] = C[i] + D[j];
            k++;
        }
    }

    for(i=0; i < n*n; i++) {
        l = binarys(a[i],b,0,n*n,0);
        sum = sum + l;
    }
    printf("%d",sum);
    return 0;

}
4

1 に答える 1

2

gcc 4.7.2 でコンパイル -Wall -Wextra -Wshadow

a.c: In function ‘binarys’:
a.c:9:9: warning: implicit declaration of function ‘partition’ [-Wimplicit-function-declaration]
a.c: In function ‘main’:
a.c:75:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘long int *’ [-Wformat]
a.c:75:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 3 has type ‘long int *’ [-Wformat]
a.c:75:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 4 has type ‘long int *’ [-Wformat]
a.c:75:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 5 has type ‘long int *’ [-Wformat]

あなたのテストケースの例

$ ./a
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
0$

あなたが提供した期待(5)と一致せず、出力後に改行を出力しません。採点者は改行を期待し、あなたがプログラムを書いていないというだけであなたのプログラムを拒否するかもしれません。

その他の基本的なテスト ケース

$ ./a
1
0 0 0 0
2

期待 1。

$ ./a
2
1 1 1 1
-3 100 100 100
0

期待 1。

$ ./a
2
-1 2 2 2
-2 3 3 3
2

予想される 0。

$ ./a
1
9223372036854775807 -9223372036854775808 1 0   // LONG_MAX, LONG_MIN on my architecture
0

期待 1。

$ ./a
0
0

正解0!

于 2013-05-29T12:17:53.670 に答える