Код не принят онлайн судьей

Я только что закончил программирование начального уровня и пытаюсь решить проблему с олимпиады. Это относительно легко, но я получаю только один правильный ответ из 10 материалов, представленных онлайн-судьей.
Вот ссылка:http://opc.iarcs.org.in/index.php/problems/SORTROWS

Кстати, я использую внешний файл для ввода, чтобы сделать ввод данных проще.
Любая помощь или советы будут оценены.
Кто-нибудь может предложить метод для проверки случайных данных быстро? я не могу позволить себе создать другую программу для этого во время соревнования.
Онлайн судья использует компилятор g ++

теперь вот мой код:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream ifs("test.txt");
struct ac
{
int arr[51];
int size;
}ar[1000];  //represents each line
int i,j,n,m,in,pos,k;
ac small;
ifs>>n;
for(i=0;i<n;i++)
{
for(j=0;;j++)
{
ifs>>in;
ar[i].arr[j]=in;
if(in==-1)
{
ar[i].size=j+1;
break;
}
}

}
for(i=0;i<n;i++)   //using selection sort
{
pos=i;
small=ar[i];
for(j=i+1;j<n;j++)
{
for(k=0;k<ar[j].size&&k<ar[i].size;k++)
{
if(ar[i].arr[k]>ar[j].arr[k])
{
small=ar[j];
pos=j;
}
else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
continue;
break;
}
}
ar[pos]=ar[i];
ar[i]=small;
for(m=0;m<ar[i].size-1;m++)
cout<<ar[i].arr[m]<<' ';
cout<<'\n';
}
return 0;
}

1

Решение

Я публикую это как отдельный ответ, потому что он полностью отличается от моего предыдущего.

Лучший способ решить эту проблему — использовать вектор из std :: arrays

std::vector< std::array<int> >

Таким образом, вы можете рассматривать каждый массив как единый объект и в соответствии с это ссылка C ++ Оператор сравнения будет работать как в одномерном массиве.

Вам не нужно самим проходить по подмассивам.

Конечно, вам нужно будет включить функции C ++ 11 в компиляторе.

1

Другие решения

Вы должны сравнивать каждый вложенный массив с текущим наименьшим вложенным массивом, а не с i-ю вложенным массивом.

for(k=0;k<ar[j].size&&k<ar[i].size;k++)
{
if(ar[i].arr[k]>ar[j].arr[k])

Попробуйте изменить это на:

for(k=0;k<ar[j].size&&k<ar[pos].size;k++)
{
if(ar[pos].arr[k]>ar[j].arr[k])

Также, IMO, вы не должны вводить последнюю запись -1 в ваших массивах.

ar[i].arr[j]=in;
if(in==-1)
{
ar[i].size=j+1;
break;
}

Измените это на:

if ( in != -1 ) {
ar[i].arr[j]=in;
ar[i].size=j+1;
}
else
{
break;
}

Тогда вам придется изменить

for(m=0;m<ar[i].size-1;m++)

в

for(m=0;m<ar[i].size;m++)
0

Это больше комментарий, чем ответ, я публикую его как таковой для лучших возможностей форматирования. В дополнение к тому, что говорили другие:

else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
continue;
break;

Вы знаете, что breakбудет выполнен, если сравнение ложно, верно? Было бы лучше отформатировать это таким образом, чтобы подчеркнуть это, если оно сделано намеренно, например:

else if(ar[i].arr[k]==ar[j].arr[k]) //to continue checking
continue;

break;

или даже с явным else,

0
По вопросам рекламы [email protected]