ahmedarifhasan Ответов: 2

Я серьезно донно как улучшить это дальше


Страница Конкурса | CodeChef[^]

Что я уже пробовал:

#include<stdio.h>
int main()
{
int c2[10000],c1[10000];
int i,k,j,T;
char s[20][100000];
scanf("%d",&T);
for(i=0;i<T;i++)
{c1[i]=0;c2[i]=0;
}
for(i=0;i<T;i++)
{
  scanf("%s",s[i]);
}
for(i=0;;i++)
{ 
  for(j=0;s[i][j]!='\0';j++)
   { 
     if(s[i][j]=='A')
       c1[i]++;
     else if(s[i][j]=='B')
       c2[i]++;
     else if(s[i][j]=='.')
       {
          for(k=j;;k++)
          {
            if(s[i][k]=='A')
              {
                c1[i]=c1[i]+(k-j);
                break;
              }  
            else if(s[i][k]=='B')
              {
                c2[i]=c2[i]+(k-j);
                break;
              }
            
          }
       }
   }     

  if(i==T-1)
   break;
}
for(i=0;i<T;i++)
{
printf("%d %d",c1[i],c2[i]);
}
}

2 Ответов

Рейтинг:
2

KarstenK

Сначала я вижу слабость или ошибку в вашем коде. Если T становится больше 20, то ваша программа выходит из строя. Или проверьте T < 20. (Если вам нужно больше T, чем работать с malloc и бесплатно)

Таким образом, вы должны улучшить взаимодействие с пользователем, выведя некоторые выходные данные ("пожалуйста, введите начальное значение меньше 20") и каковы результаты.

Я бы рекомендовал использовать критерии распада во всех циклах, таких как (i<T-1) в основном цикле, а также использовать лучшие имена для некоторых переменных, таких как T.


Рейтинг:
2

Patrice T

Цитата:
Я серьезно донно как улучшить это дальше

Что вы подразумеваете под словом "улучшить" ?
Насколько я понимаю, этот код не работает.
Это вызов, ваша задача-сделать правильный код.

Вы можете уменьшить отпечаток ноги:
Согласно ограничению: 1 ≤ T ≤ 20, так
int c2[10000],c1[10000];

может быть заменен на
int c2[20],c1[20];

и далее, вам не нужно хранить все шаблоны деревень, только один:
#include<stdio.h>
int main()
{
  int c2[20],c1[20];
  int i,k,j,T;
  char s[100000];
  scanf("%d",&T);
  for(i=0;i<T;i++)
  {
    c1[i]=0;c2[i]=0;
    
    scanf("%s",s);
    
    for(j=0;s[j]!='\0';j++)
    {
      if(s[j]=='A')
        c1[i]++;
      else if(s[j]=='B')
        c2[i]++;
      else if(s[j]=='.')
      {
        for(k=j;;k++)
        {
          if(s[k]=='A')
          {
            c1[i]=c1[i]+(k-j);
            break;
          }
          else if(s[k]=='B')
          {
            c2[i]=c2[i]+(k-j);
            break;
          }
        }
      }
    }
  }
  for(i=0;i<T;i++)
  {
    printf("%d %d",c1[i],c2[i]);
  }
}


Ваш код должен рухнуть на '..A..' и '..B..B..B..' и дать неправильные результаты на других.
Я думаю, что полное переписывание в порядке. Отладчик поможет вам понять, что не так в вашем коде.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.