МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

 

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Воронежский государственный университет»

 

Олимпиада ВГУ для школьников по информатике

2011/2012 учебный год

 

Воронежский государственный университет в соответствии с Положением и Приказом ректора проводит Олимпиаду школьников по информатике.

 

Итоги Олимпиады ВГУ для школьников по информатике

2011/2012 учебного года

 

 

 

1. Решил все задачи, из них первые три — практически без ошибок

    Победитель Олимпиады

 

    Моисеев Андрей (Гимназия им. Басова)

 

2. В основном решили большую часть задач (хотя каждый из них — разные задачи)

 

    Призеры Олимпиады

    Кучмин Александр (Лицей №2)

    Хатеев Никита (Лицей МОК №2)

    Глебов Василий (Лицей МОК №2)

    Черниговских Роман (Лицей МОК №2) – лучший результат среди 10-классников                                                           

 

3. В основном решили одну задачу, остальные — только частично

 

    Тищенко Дмитрий (п. Уразово Валуйского р-на Белгородской обл., СОШ №1) —  лучший результат среди участников не из Воронежа

    Ольферук Александр (Лицей ВУВК им. Киселева)

    Стрелков Михаил (Лицей МОК №2)

    Бердзенишвили Илья (г. Грязи Липецкой обл., СОШ №4)

 

4.  Частично решили отдельные задачи

 

    Макарова Вероника (Лицей №2) — лучший результат среди девушек

    Кожевников Михаил (Гимназия им. Платонова)

    Щеблыкин Виктор (г. Борисоглебск, СОШ №10)

    Перепелова Анастасия (Лицей ВУВК им. Киселева)

    Зубахин Евгений (Лицей МОК №2)

    Оноцкий Никита (г. Старый Оскол, СОШ №34)

 

5. Решения содержат только элементы алгоритмов

 

    Костюченко Андрей (Гимназия им. Платонова)

    Абрамов Алексей (Лицей-филиал РГСУ)

    Субботина Елена (г. Липецк, гимназия №19)

 

Комментарии жюри по оценке очного этапа и решениям отдельных задач.

 

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

 

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

 

Задача №1. Понятно, что задача определить количество нулей в десятичной записи какого-либо числа является тривиальной, если мы знаем само это число.  Речь шла именно о том, чтобы получить количество нулей в записи N! для таких значений N, когда N! нельзя уложить в стандартный числовой тип. С этой задачей справились немногие участники, наилучшее решение предложил Хатеев. Те, кто вычисляли искомую величину как [N/5], не учли, что при умножении на 25 в конец  факториала добавятся уже два нуля, на 125 — три нуля и т.д.

 

Задача №2. Не все участники рассматривали случаи, когда первая заданная координата меньше соответствующей второй, не все также выделяли случаи отрезка и точки в пересечении. Большое количество разных условий  усложняло программы. Самое изящное решение предложил Моисеев.

 

Задача №3. Здесь надо было учесть случаи одной или нескольких пустых строк перед первым абзацем, между абзацами, после последнего абзаца. Самое компактное и логичное решение предложил Стрелков.

 

Задача №4. Полностью правильного решения не дал никто (не была обеспечена правильная обработка какого-либо из случаев: входной или искомой последовательности из одного числа, входной последовательности только из отрицательных чисел и т.д.) Несколько участников дали частично правильные решения с использованием двойного цикла перебора сумм, но они не избежали ошибок — при присвоении начального значения максимума или при определении границ внутреннего цикла (в том числе и Кучмин, программа которого больше других понравилась жюри).

 

Со всеми возникающими вопросами обращайтесь в оргкомитет Олимпиады по e-mail olymp@expert.vrn.ru.

 

Приложение.

 

Задача №2

 

Дано два прямоугольника со сторонами, параллельными осям координат. Противоположные углы первого прямоугольника задаются парами координат (x1, y1) и (x2, y2), второго прямоугольника – парами координат (x3, y3) и (x4, y4). Определить, какую геометрическую фигуру представляет собой пересечение этих прямоугольников. Случай, при котором пересечение прямоугольников представляет собой пустое множество, должен быть рассмотрен отдельно (25 баллов).

input.txt

1.5 1.5 2.5 2.5 3.5 3.5 4.5 4.5

output.txt

пустое множество

 

Решение А.Моисеева (язык Java)

 

/**

 * @author o12_moiseev_a

 */

import java.util.*;

import java.io.*;

 

class Rect {

    public Rect(float x1, float y1, float x2, float y2) {

        this.x1 = x1; this.x2 = x2;

        this.y1 = y1; this.y2 = y2;

    }

    public float x1, y1, x2, y2;

}

 

public class Main {

    public static void main(String[] argc) {

        Scanner sc = null;

        try {

            sc = new Scanner(new FileInputStream("input.txt"));

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        Rect r1 = new Rect(sc.nextFloat(), sc.nextFloat(),

                           sc.nextFloat(), sc.nextFloat());

        Rect r2 = new Rect(sc.nextFloat(), sc.nextFloat(),

                           sc.nextFloat(), sc.nextFloat());

       

        int xCross = subsetLength(r1.x1, r1.x2, r2.x1, r2.x2);

        int yCross = subsetLength(r1.y1, r1.y2, r2.y1, r2.y2);

 

        PrintWriter pw = null;

        try {

            pw = new PrintWriter(new FileOutputStream("output.txt"));

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        int min = Math.min(yCross, xCross);

        int max = Math.max(yCross, xCross);

        if(min == -1) {

            pw.println("пустое множество");

        } else if(min == 0) {

            if(max == 1) {

                pw.println("отрезок");

            } else if(max == 0) {

                pw.println("точка");

            }

        } else if(min == 1) {

            pw.println("прямоугольник");

        }

        pw.flush();

        pw.close();

    }

 

    public static int subsetLength(float start1, float end1, float start2, float end2) {

        // Я пытаюсь найти длину промежутков [start1, end1], [start2, end2]

        // и сравнить с промежутком между макс. точками

        float l1 = Math.abs(start1 - end1);

        float l2 = Math.abs(start2 - end2);

        float wholeLength = Math.max(Math.max(start1, end1), Math.max(start2, end2)) -

                            Math.min(Math.min(start1, end1), Math.min(start2, end2));

        if(l1 + l2 < wholeLength) {

            return -1; // Пустое множество

        } else if(l1 + l2 == wholeLength) {

            return 0; // Точка

        } else if(l1 + l2 > wholeLength) {

            return 1; // Множество

        }

        return -2; // До этого дойти не должно

     }

}