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

Автор MSPA, 13 лет назад, По-русски

Решал задачу с тимуса (http://acm.timus.ru/problem.aspx?space=1&num=1080). Так как я недавно начал изучать язык C#, то стараюсь сдавать задачи на нем. Но при решении этой задачи у меня возникла проблема. Подобные задачи уже решал ( и эту решил только сдал потом на C++). Алгоритм один, но написан на разных языках. Только на С++ AC, C# - Crash#6. Вот кода на C# - http://paste.org.ru/?fvq4c4) и на C++- http://paste.org.ru/?rbz2zj . Кто знает в чем может быть ошибка, поясните пожалуйста. Мне кажется ошибка в считывании. Есть ли более лучший способ считывания на C#?

Теги c#
  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

ignore
13 лет назад, # |
Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

Нужно закомментировать строчку . 
Environment.Exit(0);

Система воспринимает это как terminate процесса и считает это крешем.  Вот код, который принят.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    jte, спасибо WA6, наверное, где-то тупая ошибка значит) а почему когда я пользовался строчкой "Environment.Exit(0);" в другой задаче, решение прошло?
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      ошибки не было, просто если ее комментить, то надо было мне еще не забыть, чтобы дальше не дфсило.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Возможно, есть разница, где вызывать Exit, но я не уверен.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Ещё маленький штрих:
Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
с успехом можно заменить на просто
Split();
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Разве? Я сейчас изменил и компилятор выдает ошибку. Когда я например несколько пробелов между числами
    • 13 лет назад, # ^ |
        Проголосовать: нравится -6 Проголосовать: не нравится
      Извиняюсь, он действительно не делает RemoveEmptyEntries, проглючил.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +1 Проголосовать: не нравится

    в С# функции Split всегда нужно передавать параметры.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Один из вариантов Split описан как принимающий произвольное число аргументов типа char:
       
      public string[] Split(
      	params char[] separator
      )

      Случай .Split() фактически транслируется в Split(new char[] {}), то есть пустой массив из нуля элементов.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        но формальный параметр передать-то надо =)
        • 13 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          Он сам формально передаётся, когда пишешь без параметров. Быстрее и менее громоздко просто Split() написать, чем Split(new char[]{})
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А более быстрый метод считывания есть в C#? Ну кроме посимвольного) Console.Read();
  • 13 лет назад, # ^ |
    Rev. 8   Проголосовать: нравится +1 Проголосовать: не нравится

    Более быстрый в плане скорости - это самому писать буфферизацию, что громоздко и некрасиво. А вот быстрый в смысле написания - это активно юзать linq. Например, заполнение таблицы смежности в твоём примере можно переписать приблизительно так


        n = int.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
            foreach(int x in Console.ReadLine().Split().Select(s => int.Parse(s) - 1))
                g[i, x] = g[x, i] = 1;
    

13 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
оффтоп: сугубо синее обсуждение)
13 лет назад, # |
  Проголосовать: нравится +2 Проголосовать: не нравится
кажется на C# программируют только синие лейтенанты :) 
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Лично я не пишу контесты на шарпе=) 4 фреймуорк мало где нормально поддерживается
    • 13 лет назад, # ^ |
      Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

      linq конечно синтаксически красивая штука, но таки это то немногое (ещё BigInteger вроде как есть и аналог С++ set), чем 4.0 отличается от 2.0 для спортивного программирования (может что забыл). Пробовал на TopCoder'е писать на шарпе - оно конечно красивый и аккуратный язык, но таки гибкость C++ меня перетянула обратно. А вышеописанное считывание, написанное примерно так, как писал автор этого поста, работать будет и в .Net 2.0. Если читается из файла, то такое считывание (или streamReader.ReadToEnd().Split...) работает шустрее, чем на C++ (fscanf). (Консоль просто не тестил)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        согласен по поводу С++, сам на нем пишу большинство контестов.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Ну вообще-то лично я некоторое время был фиолетовым :) (тоже шарпер). По моему скромному мнению, C++, конечно, гибкий, но еще большую гибкость дает сочетание энного количества языков (сам могу писать и на шарпе, и на плюсах, и на яве).
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            И еще больше согласен). Так уж получилось, что в универе учили меня джаве и плюсам, а вот на работе доминирует шарп. Параллельно ради интереса пробовал что-то на питоне, и иногда это является хорошим выбором, когда надо написать быстро че-нить, и не особо жесткий тл.
          • 13 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

            Гибкий - имелось ввиду что изначальную кривизну идеи (или кривизну понятия условия) лично мне на нём править проще. Сам также знаю Java и C#, но фактически на CF или TC их не использую. Да и кодится на плюсах быстрее, но это уже скорее дело лично моей привычки.

            На работе было дело - ознакомился с Ruby. Блин, оно конечно очень круто, когда на руби можно в 2 строчки вложить 20-30 строк щарпа/плюсов, но таки не имея большой привычки да и компилятора под это счастье сейчас на компе... А ставить так лееень :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    я решаю задачи с тимуса просто для практики. А так все контесты пишу на C++, очень редко на Java.