Блог пользователя rus100

Автор rus100, история, 9 лет назад, По-русски

Решил попробывать свои силы как-то в задачах под буквой C.Выбор пал на 489 С.Смысл задачи в том что дана длина числа и сумма цифр в числе, нужно найти максимальное и минимальное такое число.Решил применить жадный алгоритм.Задачу решил частично, проходила только на 21 тесте.Вот код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            string str1 = Console.ReadLine();
            int kolvocifr = 0;
            int summacifr = 0;
            string[] strin1 = str1.Split(' ');
            kolvocifr = int.Parse(strin1[0]);
            summacifr = int.Parse(strin1[1]);
            double aver = summacifr / kolvocifr;  
            string str2 = "";
            string str3 = "";    
            int kolvodevjat = 0;
            int ostatok = 0;
            if ((aver > 9)||((summacifr==0)&&(kolvocifr>1)))
            {
                Console.WriteLine("-1" + " " + "-1");
            }
            else {
                if (summacifr >= 9) {
                    kolvodevjat = (summacifr / 9);
                    ostatok = summacifr % 9;
                    for (int i = 0; i < kolvocifr; i++) {
                        if (i < kolvodevjat) { str3 += "9"; }
                        if (i == kolvodevjat) { str3 += ostatok.ToString(); }
                        if (i > kolvodevjat) { str3 += "0"; }
                    }
                }
                else
                {
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i==0) { str3 += summacifr.ToString(); }
                        if (i > 0) { str3 += "0"; }
                    }
                    }
                if (summacifr >9)
                {
                    if (kolvocifr == 2)
                    {


                        str2+= ostatok.ToString();
                        str2 += "9";
                    } 
                    if (kolvocifr > 2) 
                    {kolvodevjat = ((summacifr-1) / 9);
                    ostatok = (summacifr-1) % 9;
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i==0) { str2 += "1"; }
                        if ((i < kolvocifr-kolvodevjat-1)&&(i>0)) { str2 += "0"; }
                        if (i == kolvocifr - kolvodevjat-1) { str2 += ostatok.ToString(); }
                        if (i > kolvocifr - kolvodevjat-1) { str2 += "9"; }
                    } }
                    
                }
                else
                {
                    for (int i = 0; i < kolvocifr; i++)
                    {
                        if (i < kolvocifr-1) {
                            str2 += "1";
                        }
                        if (i == kolvocifr-1) {
                            str2 += (summacifr - kolvocifr+1).ToString();
                        }
                        if (i > kolvocifr - 1) { str2 += "0"; }
                    }
                } }
                Console.WriteLine(str2 + " " + str3);
            Console.ReadLine();
        }                                      
    }
}

Помогите понять где ошибка.Буду благодарен.

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Если зайти в Попытки, кликнуть на номер попытки и пролистать вниз, то можно увидеть все тесты, на которых тестировалась программа (а также тот, на котором упала), собственно Ваше решение работает неправильно на входных данных 2 18.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Это-то понятно...Мне бы как это можно исправить в программе.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
        if (summacifr >9)
                      {
                          if (kolvocifr == 2)
                          {
      
      
                              str2+= ostatok.ToString();
                              str2 += "9";
                          } 
      

      Довольно странно обрабатывается случай с двумя цифрами. Если, как во входных данных, цифр две, а их сумма восемнадцать, то сначала прибавится остаток (0), потом одна девятка.

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Вот так всегда со сложными задачами у меня.В общем понятно как решать, но реализация хромает.Не хватает терпения, интеллекта и опыта.

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Теперь проходит до 25 теста.Вот код

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          
          namespace ConsoleApplication6
          {
              class Program
              {
                  static void Main(string[] args)
                  {
                      string str1 = Console.ReadLine();
                      int kolvocifr = 0;
                      int summacifr = 0;
                      string[] strin1 = str1.Split(' ');
                      kolvocifr = int.Parse(strin1[0]);
                      summacifr = int.Parse(strin1[1]);
                      double aver = (double)summacifr / (double)kolvocifr;
                      string str2 = "";
                      string str3 = "";
                      int kolvodevjat = 0;
                      int ostatok = 0;
                      if ((aver > 9) || ((summacifr == 0) && (kolvocifr > 1)))
                      {
                          Console.WriteLine("-1" + " " + "-1");
                      }
                      else
                      {
                          if (summacifr >= 9)
                          {
                              kolvodevjat = (summacifr / 9);
                              ostatok = summacifr % 9;
                              for (int i = 0; i < kolvocifr; i++)
                              {
                                  if (i < kolvodevjat) { str3 += "9"; }
                                  if (i == kolvodevjat) { str3 += ostatok.ToString(); }
                                  if (i > kolvodevjat) { str3 += "0"; }
                              }
                          }
                          else
                          {
                              for (int i = 0; i < kolvocifr; i++)
                              {
                                  if (i == 0) { str3 += summacifr.ToString(); }
                                  if (i > 0) { str3 += "0"; }
                              }
                          }
                          if ((kolvocifr == kolvodevjat)&&(ostatok==0))
                          {
                              kolvodevjat = ((summacifr) / 9);
          
                              for (int i = 0; i < kolvocifr; i++)
                              {
                                  str2 += "9";
                              }
                          }
                          else { if (summacifr > 9)
                          {
                              if (kolvocifr == 2)
                              {
          
          
                                  str2 += ostatok.ToString();
                                  str2 += "9";
                              }
                             
                              if (kolvocifr > 2)
                              {
                                  if (kolvocifr > kolvodevjat + 1)
                                  {
                                      kolvodevjat = ((summacifr - 1) / 9);
                                      ostatok = (summacifr - 1) % 9;
                                  }
                                  else {
                                      kolvodevjat = ((summacifr) / 9);
                                      ostatok = (summacifr) % 9;
                                  
                                  }
                                  
                                  for (int i = 0; i < kolvocifr; i++)
                                  {
                                      if ((i == 0)&&(kolvocifr>kolvodevjat+1)) { str2 += "1"; }
                                      if ((i <= kolvocifr - kolvodevjat - 1) && (i > 0)) { str2 += "0"; }
                                      if ((i == kolvocifr - kolvodevjat - 1)&&(ostatok>0)) { str2 += ostatok.ToString(); }
                                      if (i > kolvocifr - kolvodevjat - 1) { str2 += "9"; }
                                  }
                              }
          
                          }
                          else
                          {
                              for (int i = 0; i < kolvocifr; i++)
                              {
                                  if (i < kolvocifr - 1)
                                  {
                                      str2 += "1";
                                  }
                                  if (i == kolvocifr - 1)
                                  {
                                      str2 += (summacifr - kolvocifr + 1).ToString();
                                  }
                                  if (i > kolvocifr - 1) { str2 += "0"; }
                              }
                          }
                      } }
          
                         
                      Console.WriteLine(str2 + " " + str3);
                      Console.ReadLine();
                  }
              }
          }
          
          
          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Хочешь прогрессировать решай задачи самостоятельно, а не проси помощи по поводу каждого бага.

»
9 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

На будущее — код лучше бы оставлять ссылкой на какой-то из ресурсов по типу ideone, так его гораздо проще будет прочесть и он не будет занимать много места в посте.