Это help для команды по спортивному программированию ВАЖНО: 1 строки это зло - для задач большой размерности 2 метод join в mono develop имеет меньше перегрузок, чем в C# .NET 3 если есть возможность использовать тип данных с меньшей размерностью, нужно так и делать (для задач большой размерности) 4 языки с динамическим типизированием - Python - не дают делать выбор типа данных (в меньшую сторону) для массива - это мешает решать задачи большой размерности ============================================ 26.05.2018 - после Олимпиады - разбор задач D. Кучность «стрельбы» http://olymp.itas.pstu.ru/ru/problem-pid-c428?ps=1&smt=7&smpwid=0 Вход 5 7 0101010 1011111 0111101 1011111 0000000 Выход 3 Реализация на Python 3: text = open('input.txt','r').read() lines = text.split('\n') rowCount = int(lines[0].split(' ')[0]) colCount = int(lines[0].split(' ')[1]) matr = [] # это будет матрица - как двумерный массив из 0 и 1 for i in range(1, rowCount+1): # в вер. 2.7.6 нет срезов списков tmp = [] for j in range(0, colCount): tmp.append(int(lines[i][j])) matr.append(tmp) for row in range(1, rowCount): for col in range(1, colCount): if matr[row][col] > 0: matr[row][col] = min(matr[row-1][col], matr[row][col-1], matr[row-1][col-1]) + 1 max = 0 for r in matr: for el in r: if el>max: max=el #print(el, end="") #print() print(max) B. Арабский перевод Вход IV Выход 4 Вход CCCXCIX Выход 399 Основная логика программы: 1 все символы переводим по отдельности в арабские числа: IX -> [1, 10] 2 расставляем минусы там где нужно: [-1, 10] 3 суммируем: -1 + 10 = 9 Реализация на Python 2 - со словарём - она покороче: rom = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} res = [] line = raw_input() pos = 0 while pos 0) // если там 1 - закрашенная клетка { for (int rowF = 0; rowF < count; rowF++) // делаем перебор всех ячеек из соответсвующей колонки на передней грани { if (arrF[rowF, colU] > 0) { arrR[rowU, rowF] = 1; // ответ пишем для наклонённой матрицы правой - чтобы обеспечить вид проекции } } } } // выводим результат for (int row=0; row lst = new List(); List lstNew = new List(); foreach (char ch in str) { lst.Add(ch); } // символы строки в список символов int pos; char posChar; int countNum; for (int step = 0; step < count - 1; step++) // указанное кол-во шагов { lstNew.Clear(); // на каждом шаге начинаем сначала pos = 0; posChar = lst[pos]; // берём новый символ countNum = 0; // устанавливаем его начальное количество while (pos < lst.Count) // движемся по строке { if (lst[pos] == posChar) countNum++; else { lstNew.Add(Convert.ToChar(countNum.ToString())); lstNew.Add(Convert.ToChar(posChar.ToString())); posChar = lst[pos]; countNum = 1; } pos++; // переходим к следующему символу } lstNew.Add(Convert.ToChar(countNum.ToString())); lstNew.Add(Convert.ToChar(posChar.ToString())); lst.Clear(); lst.AddRange(lstNew); } //Console.WriteLine(String.Join("", lst)); // нельзя использовать Join на Mono в контестере foreach (char ch in lst) { Console.Write(ch); } Console.ReadKey(true); } } 25.05.18 - тренировка, темы: 1 Арифметика 2 Комбинаторика 3 Геометрия - решаем №1 (20 мин.) и №2 (20 мин.) самостоятельно - №1 сравниваем с моим ответом, №2 - провести через контестер - задачу №3 - я расскажу как проще всего сделать 1 - # найти с помощью "решета Эратосфена" кол-во простых чисел до введённого max # задачу с рисунком можно увдеть тут (номер 4): https://pcoding.ru/indexSP.html 2 - Край-2012 - http://olymp.itas.pstu.ru/ru/contest-cid-138b-sh-1 - Энергетическая ценность -> на комбинаторику 3 - # Дана прямая линия и несколько квадратов на плоскости. # Найти количество квадратов, которые пересекает линия. Формат входного файла: Первая строка - это четыре целых числа - координаты двух точек, через которые проходит линия через пробел: x1 y1 x2 y2 (-1000: # ишем следующую непустую позицию m = i; break # назначаем шаг для следующей итерации count = 0 for elm in lst: if elm>1: # считаем сколько не вычеркнутых count += 1 print(count) задача 2 - Python 2 text = open('input.txt','r').read() lines = text.split('\n') maxW = float(lines[0].split()[0]) count = int(lines[0].split()[1]) lines = lines[1:count+1] c = [] w = [] for line in lines: c.append(int(line.split()[0])) w.append(float(line.split()[1])) maxC = 0 countNabor = 1 << count for row in range(countNabor): tmpC = 0 tmpW = 0 for col in range(count): if (row & (1 << col) > 0): tmpC += c[col] tmpW += w[col] if tmpW<=maxW and tmpC>maxC: maxC = tmpC print maxC задача 3 - Python 3 def checkDot(x, y): # проверим положение точки относительно линии return A*x + B*y + C # если =0, то лежит на линии, м/б >0 или <0 def getCountCross(): countCross = 0 # количество пересечённых линией квадратов for elm in kvs: # перечислим все квадраты x = elm[0]; y = elm[1]; r = elm[2] dot1 = checkDot(x, y) # это 4 угла квадрата dot2 = checkDot(x+r, y) dot3 = checkDot(x, y+r) dot4 = checkDot(x+r, y+r) v1 = dot1>0 and dot2>0 and dot3>0 and dot4>0 # все углы квадрата с одной стороны от прямой v2 = dot1<0 and dot2<0 and dot3<0 and dot4<0 # или с другой стороны от прямой if not(v1 or v2): # если не так, то линия пересекает данный квадрат countCross += 1 # учтём такой квадрат return countCross text = open('input.txt','r').read() # читаем весь файл lines = text.split('\n') # делим на строки x1 = int(lines[0].split()[0]) # координаты y1 = int(lines[0].split()[1]) # первой точки x2 = int(lines[0].split()[2]) # координаты y2 = int(lines[0].split()[3]) # второй точки A = y2-y1 # коэффициенты B = x1-x2 # прямой линии для уравнения: A*x+B*y+C=0 C = x2*y1-x1*y2 # по координатам двух её точек count = int(lines[1]) # количество квадратов из файла kvs = [] # список списков с данными про квадраты for num in range(count): tmp = lines[num+2].split() # каждую строку из файла разбиваем на три данных x y r kvs.append([int(tmp[0]), int(tmp[1]), int(tmp[2])]) # добавляем данные как список print(getCountCross()) # печатаем ответ ============================================ 18.05.18 - тренировка - за 2 часа решить 3 задачи - средние/выше среднего Край-2012 - http://olymp.itas.pstu.ru/ru/contest-cid-138b-sh-1 1 - Теория чисел -> на арифметику - всегда такая есть 2 - Письмо -> на символы, перестановки, шифрование - просто интересно 3 - Энергетическая ценность -> на комбинаторику - очень часто такая есть Решать нужно на C# Читаем и думаем - 5 минут Обсуждаем у доски ПРОТОТИП - 5 минут Кодируем и проводим - см.ниже ~... ------------------------------------------- тут будут решения на Python: -1- ~20мин # работает на новых версиях 2.7.14 # на страых не работает срез списка - lines[1:] text = open('input.txt','r').read() lines = text.split('\n') count = int(lines[0]) arr = [int(elm) for elm in lines[1:]] def check(n): if n<2: return False if n<4: return True if n%2==0: return False for i in range(3, int(n**0.5)+1, 2): if n%i==0: return False return True for num in arr: for n in range(2, int(num/2)+1): if check(n) and check(num-n): print str(n) + " " + str(num-n) break -2- ~30мин text = open('input.txt','r').read() lines = text.split('\n') count = int(len(lines[0]) ** 0.5) # размер матрицы как корень из длины строки txt = lines[0] # это строка для шифрования matr = lines[1:count+1] # это начальная матрица lines = lines[1:count+1] # просто такая же по размеру матрица, потом затрём результирующими символами pos = 0 for i in range(4): # все 4 положения матрицы for row in range(count): # перебираем все строки for col in range(count): # перебираем все столбцы if matr[row][col]=="#": # нашли отверстие в матрице lines[row]=lines[row][:col] + txt[pos] + lines[row][col+1:] # вставляем в позицию row/col символ из строки pos+=1 # и смещаем позицию в исходной строке newMatr = [] # сначала повёрнутую матрицу формируем отдельно for row in range(count): newStr = "" for col in range(count): newStr += matr[count-1-col][row] newMatr.append(newStr) matr = newMatr[:] # повёрнутая на 90гр. матрица, загружаем в старую for line in lines: # вывод строк результата print line -3- ~20мин. ============================================ 11.05.18 Входной файл: -------- -------- -------- -------- -------- -----K-- ------h- -------b Решение: using System; class solver { static void Main() { int rowB = 0, colB = 0, rowK = 0, colK = 0, rowH = 0, colH = 0; string[] lines = System.IO.File.ReadAllLines("input.txt"); for (int row = 0; row<8; row++) { for (int col = 0; col<8; col++) { if (lines[row][col] == 'K') { rowK = row; colK = col; } // белый король if (lines[row][col] == 'b') { rowB = row; colB = col; } // черный слон if (lines[row][col] == 'h') { rowH = row; colH = col; } // чёрный конь } } bool diag_1 = (rowK - colK) == (rowB - colB); bool diag_2 = (rowK + colK) == (rowB + colB); bool result = (diag_1 || diag_2); if (((rowK + colK) == (rowB + colB)) && ((rowH + colH) == (rowB + colB)) && ((rowH - rowK) * (rowH - rowB) < 0)) { result = false; } // второстепенная диагональ if (((rowK - colK) == (rowB - colB)) && ((rowH - colH) == (rowB - colB)) && ((colH - colK) * (colH - colB) < 0)) { result = false; } // главная диагональ Console.WriteLine(result? "yes": "no"); Console.ReadKey(); } } ================================================ 04.05.18 using System; class solver { static void Main() { int max = int.Parse(Console.ReadLine()); string[] words = Console.ReadLine().Split(); int count = words.Length; int[] arr = new int[count]; for (int i = 0; i < count; i++) arr[i] = words[i].Length; bool result = false; int countNabor = 1 << count; for (int nabor=0; nabor 0) summa += arr[pos]; } if (summa == max) result = true; } Console.WriteLine(result? "yes": "no"); Console.ReadKey(); // это нужно убрать при подаче в контестер } } using System; using System.IO; class solver { struct Point { public int row; public int col; } static void Main() { string[] lines = File.ReadAllLines("input.txt"); Point posK, posh; posK.row = 0; posK.col = 0; posh.row = 0; posh.col = 0; for (int row=0; row<8; row++) { for (int col=0; col<8; col++) { if (lines[row][col] == 'K') { posK.row = row; posK.col = col; } if (lines[row][col] == 'h') { posh.row = row; posh.col = col; } } } bool result = false; if ( (Math.Abs(posK.row-posh.row) == 2) && (Math.Abs(posK.col - posh.col) == 1) || (Math.Abs(posK.row - posh.row) == 1) && (Math.Abs(posK.col - posh.col) == 2) ) { result = true; } Console.WriteLine(result); Console.ReadKey(); // это нужно убрать при подаче в контестер } } =================================================== Это решения команды с Олимпиады 26.05.2018 Решето using System; using System.Collections.Generic; class solver { static void Main(string[] args) { int n = Convert.ToInt32(Console.ReadLine()); int sum = n-1; int[] arr = new int[n + 1]; int k = 2; int step = k; while (k * k <= n) { for (int i = k * k; i <= n; i += step) { if(arr[i]!= 1) { arr[i] = 1; sum--; } } for (int i = k + 1; i <= n; i++) { if (arr[i] != 1) { k = i; step = k; break; } } } Console.WriteLine(sum); //Console.ReadLine(); } } Арабский перевод using System; using System.Collections.Generic; using System.IO; class solver { static void Main(string[] args) { string line = Console.ReadLine(); int[] arr = new int[line.Length]; int summ = 0; bool en = true; int temp = 0; for (int i = line.Length - 1; i >= 0; i--) { switch (line[i]) { case 'I': if (temp == 1) summ += 1; else { temp = 1; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'V': if (temp == 5) summ += 5; else { temp = 5; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'X': if (temp == 10) summ += 10; else { temp = 10; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'L': if (temp == 50) summ +=50; else { temp = 50; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'C': if (temp == 100) summ += 100; else { temp = 100; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'D': if (temp == 500) summ += 500; else { temp = 500; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; case 'M': if (temp == 1000) summ += 1000; else { temp = 1000; if ((summ - temp) > temp) { if (summ < temp) summ += temp; else { summ -= temp; } } else summ += temp; } break; } //arr[i] = temp; } Console.WriteLine(summ); //Console.ReadLine(); } } Организация концерта using System; using System.Collections.Generic; using System.IO; class solver { public struct person { public int timelong; public int price; } static void Main(string[] args) { string[] lines = File.ReadAllLines("input.txt"); int timemin = Convert.ToInt32(lines[0]); int summ = 60001; List prss = new List(); for(int i = 1; i 0) { temptime += prss[pos].timelong; tempprice += prss[pos].price; } } if(temptime>=timemin & tempprice