在线法官未接受代码

Code not being accepted by online judge

本文关键字:代码 在线      更新时间:2023-10-16

我刚刚完成初级编程,正在尝试一个奥林匹克竞赛中的问题。这相对容易,但我从一个在线评委的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;
}

我将此作为单独的答案发布,因为它与我以前的答案完全不同。

解决这个问题的更好方法是使用std::arrays的向量

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

通过这种方式,您可以将每个数组视为一个单独的实体,并且根据这个C++链接,比较运算符将直接像在1D数组中一样工作。

您不需要自己循环子数组

当然,您需要在编译器中启用C++11功能。

您应该将每个子数组与当前最小的子数组进行比较,而不是与第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++)

这与其说是一个答案,不如说是一条评论,我这样发布是为了更好地格式化。除了其他人所说的:

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;

或者甚至具有明确的CCD_ 2。