Форум » Обработка числовых последовательностей » 27 задача про сбор мусора из досрочного ЕГЭ2022 » Ответить

27 задача про сбор мусора из досрочного ЕГЭ2022

tatum123: Вариант решения будет ниже. Текст задачи: ------------------------------------------------------------------------------------------- В городе M расположена кольцевая автодорога длиной в N километров с движением в обе стороны. На каждом километре автодороги расположены пункты приема мусора определенной вместимости. В пределах кольцевой дороги в одном из пунктов сборки мусора собираются поставить мусороперерабатывающий завод таким образом, чтобы стоимость доставки мусора была минимальной. Стоимость доставки мусора вычисляется, как вместимость пункта сбора умноженная на расстояние от пункта сбора мусора до мусороперерабатывающего завода. Если мусороперерабатывающий завод находится рядом с пунктом сбора расстояние считается нулевым. Контейнеры нумеруются с 1 до N. Рядом с каким пунктом сбора мусора нужно поставить мусороперерабатывающий завод? Описание входных данных: Первое число N — количество контейнеров для мусора. Последующие N чисел — количество килограмм мусора, которое производится на точке. Описание выходных данных: Одно число — номер контейнер для мусора рядом с которым стоит расположить перерабатывающий завод. Пример организации входных данных: 6 8 20 5 13 7 19 Для данного примера ответ — 6 (7⸱1 + 13⸱2 + 5⸱3 + 20⸱2 + 8⸱1 + 19⸱0). -------------------------------------------------------------------------------------- Файлы тут: https://4ege.ru/trening-informatika/64504-variant-s-dosrochnogo-etapa-2022-po-informatike.html -------------------------------------------------------------------------------------- Вариант решения: [pre2] def r(i,p,N): ''' вычисляем растояние между точкой сбора мусора p и мусорного контейнера i как между стрелками на циферблате с числами 1..N; p - точка сбора мусора (мусорозавод), часовая стрелка; i - мусорный ящик, минутная стрелка ''' l=abs(p-i) if l<=N//2: return l else: return N-l # из файла с данными удалите первую строку с N s=open('27-A.txt','r').read().splitlines() s=list(map(int,s)) N=len(s) smin=10**15 pmin=10**15 # подсчет стоимости своза мусора в точку p for p in range(1,N+1): ss=[] # массив расстояний от точки p for k in range(len(s)): t=r(k+1,p,N) ss.append(t) st=0 # сюда складываем стоимости сбора мусора for i in range(1,N+1): st+=s[ i-1]*ss[ i-1] if st<smin: smin=st pmin=p print('>>>',smin,pmin) [/pre2] ---------------------------------------------- Для файла B.txt: - считаем для p (точка сбора) - цикл с шагом 10000 - находим что искомая p в районе 40000 - сужаем поиск с 38000 до 42000 с шагом 1000 и тд за 5 минут есть ответ.

Ответов - 3

safinim: ### uses school; assign(input,'27-B.txt');reset(input); var n:=ri; var s1,s2,s3,s4,m,p:int64; var a:=new int64[n*2+1];// двойной размер var nd2:=n div 2; // половина N for var i:=1 to nd2+1 do begin var x:=ri; s1+=x*(i-1); // стоимость доставки до 1 пункта (1 половина + дальний пункт) s3+=x;// сумма данных первых N+1 a:=x;a[i+n]:=x end; s3-=a[1]; for var i:=nd2+2 to n do begin var x:=ri; s2+=x*(n-i+1);// стоимость доставки до 1 пункта (2 половина ) s4+=x;// сумма данных остальных N-1 a:=x; a[i+n]:=x end; m:=s1+s2; // сумма доставки до 1 пункта p:=1; for var i:=2 to n do // перебор для остальных пунктов begin s1:=s1-s3+a[i+nd2]*nd2; s3:=s3+a[i+nd2]-a; s2:=s2+s4+a[i-1]-a[i+nd2]*nd2; s4:=s4+a[i-1]-a[i+nd2]; if s1+s2<m then (m,p):=(s1+s2,i); end; pr(p) //ответ

safinim: вместо a, a[ i]

safinim: ### uses school; assign(input,'27-99b.txt');reset(input); var n:=ri; var s1,s2,s3,s4,m,p:int64; var a:=new int64[n*2+1];// двойной размер var nd2:=n div 2; // половина N for var i:=1 to nd2+1 do begin var x:=ri; s1+=x*(i-1); // стоимость доставки до 1 пункта (1 половина + дальний пункт) s3+=x;// сумма данных первых N+1 a[ i]:=x;a[i+n]:=x end; s3-=a[1]; for var i:=nd2+2 to n do begin var x:=ri; s2+=x*(n-i+1);// стоимость доставки до 1 пункта (2 половина ) s4+=x;// сумма данных остальных N-1 a[ i]:=x; a[i+n]:=x end; m:=s1+s2; // сумма доставки до 1 пункта p:=1; for var i:=2 to n do // перебор для остальных пунктов begin s1:=s1-s3+a[i+nd2]*nd2; s3:=s3+a[i+nd2]-a[ i]; s2:=s2+s4+a[i-1]-a[i+nd2]*nd2; s4:=s4+a[i-1]-a[i+nd2]; if s1+s2<m then (m,p):=(s1+s2,i); end; pr(p) //ответ




полная версия страницы