Я сейчас решаю эту проблему: 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;
}
Укажите мне, что мне не хватает