Ограничения в codechef - PullRequest
0 голосов
/ 02 июля 2018

Я сейчас решаю эту проблему: https://www.codechef.com/problems/DISHLIFE

Формат ввода в этом вопросе следующий (все целые числа):

3 (n) 4 (k)

3 1 2 3

2 1 3

2 1 2

Во 2-4-й строке 1-е число обозначает количество элементов в строке. Обозначим это число через p

В ограничениях четко указано, что 1 <= p <= k. </p>

хочу взять

1 2 3

1 3

1 2

как двумерный массив. Итак, я объявляю этот массив с помощью [n] [k]. Но когда я делаю это, я получаю неправильный ответ или ошибку во время выполнения в некоторых тестовых случаях. Когда я беру [n] [1000], мой код работает совершенно нормально.

Вот редакционная статья вопроса: https://discuss.codechef.com/questions/95658/dishlife-editorial?page=1#130775 Как объяснено в редакционной статье, я беру двумерный массив a [n] [k]. Его размер равен n * k, поскольку число столбцов равно Pi и Pi <= K. Пожалуйста, прочтите раздел об ограничениях и вводе кода: codechef.com/problems/DISHLIFE. Но, когда я отправляю проблему, я получаю ошибку времени выполнения и неправильный ответ в 2 из 8 тестовых случаев. Вместо [n] [k], когда я объявляю [n] [1000], мой код принимается. Я просто хочу знать, почему a [n] [k] дает ошибку времени выполнения, поскольку число столбцов в матрице никогда не будет больше, чем k </p>

Вот мой код (если кому-то интересно):

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

int main()
{
    long t,n,k,i,j,s,all,some,sad;
    scanf("%ld",&t);
    while(t--){
        long temp;
        sad=all=some=0;
        scanf("%ld%ld",&n,&k);
        int a[k+1],matrix[n][k],size[n];
        for(i=1;i<=k;i++)
        a[i]=0;
        for(i=0;i<n;i++){
            scanf("%ld",&s);
            size[i]=s;
            for(j=0;j<s;j++){
            scanf("%ld",&matrix[i][j]);
            temp=matrix[i][j];
            a[temp]++;
        }
        }
        for(i=1;i<=k;i++)
        if(!a[i])
        sad=1;
        if(sad==1){
            printf("sad\n");
            continue;
        }

        for(i=0;i<n;i++){
            for(j=0;j<size[i];j++){
            temp=matrix[i][j];
            if(a[temp]==1){
            all++;
            break;
            }
        }
        }
        if(all==n)
        printf("all\n");
        else
        printf("some\n");

}

}

Кроме того, я увидел код, в котором даже [n] [20] работали совершенно нормально. Вот этот код:

#include <stdio.h>

int main()
{
    int t,n,k,i,j,a[100000],b[100000][20],ch;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        for(i=0;i<k;i++)
        a[i]=0;
        ch=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&b[i][0]);
            for(j=1;j<=b[i][0];j++)
            {
                scanf("%d",&b[i][j]);
                a[b[i][j]-1]++;
            }
        }
        for(i=0;i<k;i++)
        if(a[i]==0)
        {
            ch=1;break;//impossible
        }
        if(ch==1)
        printf("sad\n");
        else//possible
        {
            for(i=0;i<n;i++)
            {
                ch=0;
                for(j=1;j<=b[i][0];j++)
              {
                if(a[b[i][j]-1]==1)//its contri matters
                {
                    ch=1;break;
                }
              }
            if(ch==0)//its contri doesn't matter
            {
                printf("some\n");
                break;
            }
            }
            if(ch==1)
            printf("all\n");
        }

    }
    return 0;
}

Укажите мне, что мне не хватает

...